静态方法,类方法,属性方法

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'

 

posted on 2017-07-31 11:09  momo8238  阅读(275)  评论(0编辑  收藏  举报