zoukankan      html  css  js  c++  java
  • 静态方法,类方法,属性方法

    1.静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。相当于类的工具包。不需要 self 参数了。

    class Dog(object):
        def __init__(self,name):
            self.name=name
        @staticmethod  #实际上跟类没什么关系了,相当于一个独立的函数。
        def eat(self,food):
            print("%s is eating %s"%(self.name,food))
    
        def drink(self,food):
            print("%s is drinking %s"%(self.name,food))
    
    d1=Dog("Lily")
    d1.drink("Cooola")  #drink正常执行
    d1.eat("baozi") #静态方法
    

     运行结果:

    Traceback (most recent call last):
      File "<encoding error>", line 13, in <module>
    TypeError: eat() missing 1 required positional argument: 'food'
    Lily is drinking Cooola
    

     2.类方法只能访问类变量,不能访问实例变量。

    class Dog(object):
        n=123
        def __init__(self,name):
            self.name=name
        @classmethod  #类方法,被修饰的下列函数只能访问类变量,不能访问实例变量。
        def eat(self,food):
            print("类变量%s" % self.n)
            print("%s is eating %s"%(self.name,food))
    
        def drink(self,food):
            print("%s is drinking %s"%(self.name,food))
    
    d1=Dog("Lily")
    d1.drink("Cooola")  #drink正常执行
    d1.eat("baozi") #类方法
    

     运行结果:

    Lily is drinking Cooola
    类变量123
    Traceback (most recent call last):
      File "<encoding error>", line 15, in <module>
      File "<encoding error>", line 8, in eat
    AttributeError: type object 'Dog' has no attribute 'name'
    

     3.属性方法

    把一个方法变成一个静态属性。隐藏实现细节。就不能加()调用了。可以给属性方法赋值。

    调用方法的时候需要加 (), 调用属性或变量的时候,不需要加().

    class Dog(object):
    
        def __init__(self,name):
            self.name=name
            self.__food=None
    
        @property  #属性方法
        def eat(self):
            print("%s is eating %s"%(self.name,self.__food))
    
        @eat.setter
        def eat(self,food):
            print("set to food:",food)
            self.__food=food
    
    d=Dog("Lily")
    d.eat
    d.eat="baozi" #属性方法
    d.eat
    

     运行结果:

    Lily is eating None
    set to food: baozi
    Lily is eating baozi
    

    4.属性方法在实例中不能以del d.eat 的方式删除。删除方法如下:

    class Dog(object):
    
        def __init__(self,name):
            self.name=name
            self.__food=None
    
        @property  #把一个方法变成属性
        def eat(self):
            print("%s is eating %s"%(self.name,self.__food))
    
        @eat.setter  #修改它
        def eat(self,food):
            print("set to food:",food)
            self.__food=food
    
        @eat.deleter  #删除它
        def eat(self):
            del self.__food
            print("删除完毕")
    
    d=Dog("Lily")
    d.eat
    d.eat="baozi" #属性方法
    d.eat
    del d.eat
    d.eat
    

     运行结果:

    Lily is eating None
    set to food: baozi
    Lily is eating baozi
    删除完毕
    Traceback (most recent call last):
      File "<encoding error>", line 26, in <module>
      File "<encoding error>", line 9, in eat
    AttributeError: 'Dog' object has no attribute '_Dog__food'
    
  • 相关阅读:
    第七章 路由 68 路由-前端路由和后端路由的概念
    第六章 组件 67 使用ref获取DOM元素和组件引用
    第六章 组件 65-66 组件案例-发表评论功能的实现
    第六章 组件 63 组件传值-父组件向子组件传值和data与props的区别
    第六章 组件 62 组件-组件定义方式的复习
    第六章 组件 61 动画-小球动画flag标识符的作用分析
    第六章 组件 60 组件切换-应用切换动画和mode方式
    第六章 组件 59 组件切换-使用Vue提供的component元素实现组件切换
    vscode代码格式化 空格的配置
    vim配置C++开发环境 win10
  • 原文地址:https://www.cnblogs.com/momo8238/p/7262097.html
Copyright © 2011-2022 走看看