一、静态方法 @staticemethod
只是名义上归类管理, 实际上在静态方法里访问不了类或实例中的任何属性。
实例:
class Dog(object): '''这个类是描述狗这个对象的''' def __init__(self,name): self.name = name @staticmethod #实际上跟类没什么关系了,只是名义上归类管理, 实际上在静态方法里访问不了类或实例中的任何属性 def eat(self): print("%s is eating %s" %(self.name,'d')) d=Dog('doggie') d.eat()
返回:
在类的动态方法前面加上了“@staticmethod”之后,这个动态方法就已经和类没有什么关系,self不会自动传入。
二、类方法 @classmethod
只能访问类变量,不能访问实例变量
实例:
class Dog(object): '''这个类是描述狗这个对象的''' n='我不是实例变量' def __init__(self,name): self.name = name @classmethod #只能访问类变量,不能访问实例变量 def p(self): print('我是类变量,%s'%self.n) #注意,此处只能调用类变量,传入的变量一定要写成self.var的格式。 def eat(self): print('%s is eating...'%self.name) d=Dog('doggie') d.eat() d.p() #没有被@classmethod的方法可以正常调用实例变量。
返回:
如果上面实例中的d.eat()也被“@classmethod”方法,那么则会返回下面的错误:
三、属性方法 @property
把一个方法变成一个静态属性
class Dog(object): '''这个类是描述狗这个对象的''' def __init__(self,name): self.name = name @property def eat(self): print('%s is eating...'%self.name) d=Dog('doggie') d.eat
返回:
注意:由于“@property”方法已经把d.eat方法变成了一个静态属性,如果没有“@property”方法,执行d.eat,不会调用执行d.eat方法;但由于“@property”将d.eat方法转变为一个静态属性,则不能通过d.eat()调用,会返回“TypeError: 'NoneType' object is not callable”。
如果被装饰的方法中不需要传入参数,则可以通过d.eat执行。
如果需要传入参数,则可以通过@setter的方式给静态属性传入指定参数:
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('将food传入静态方法eat中的self.__food中去',food) self.__food=food d=Dog('doggie') d.eat d.eat='包子' d.eat
返回:
删除属性的方法:
删除实例的方法是
del 指定方法
但是,如果直接执行 del d.eat会报错“AttributeError:can't delete attribute”,属性是不能用del删除的。
下面是删除属性的方法:
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('将food传入静态方法eat中的self.__food中去',food) self.__food=food @eat.deleter def eat(self): del self.__food print('成功删除执行的私有属性') d=Dog('doggie') d.eat d.eat='包子' d.eat del d.eat
d.eat
返回:
成功执行del d.eat(包含这条)以上的所有命令,但是在删除属性self.__food后,没有了self.__food属性,报错