面向對象補充之方法
一、靜態方法 @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()
返回:
[email protected],這個動態方法就已經和類沒有什麽關系,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() [email protected]
返回:
如果上面實例中的d.eat()[email protected],那麽則會返回下面的錯誤:
三、屬性方法 @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
返回:
註意:[email protected]態屬性,[email protected],執行d.eat,不會調用執行d.eat方法;[email protected],則不能通過d.eat()調用,會返回“TypeError: ‘NoneType‘ object is not callable”。
如果被裝飾的方法中不需要傳入參數,則可以通過d.eat執行。
面向對象補充之方法