靜態方法(@staticmethod) 通過@staticmethod裝飾器即可把其裝飾的方法變為一個靜態方法,什麼是靜態方法呢?其實不難理解,普通的方法,可以在實例化後直接調用,並且在方法里可以通過self.調用實例變數或類變數,但靜態方法是不可以訪問實例變數或類變數的,一個不能訪問實例變數和類變 ...
靜態方法(@staticmethod)
通過@staticmethod裝飾器即可把其裝飾的方法變為一個靜態方法,什麼是靜態方法呢?其實不難理解,普通的方法,可以在實例化後直接調用,並且在方法里可以通過self.調用實例變數或類變數,但靜態方法是不可以訪問實例變數或類變數的,一個不能訪問實例變數和類變數的方法,其實相當於跟類本身已經沒什麼關係了,它與類唯一的關聯就是需要通過類名來調用這個方法。
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print("%s is eating %s" %(self.name,food)) d = Dog("chenronghua") d.eat("包子")
運行結果如下:
chenronghua is eating 包子
上面我們創建了一個類,代碼也能夠正常執行。下麵,在eat()方法上加靜態方法。
class Dog(object): def __init__(self,name): self.name = name @staticmethod #加上靜態方法 def eat(self,food): print("%s is eating %s" %(self.name,food)) d = Dog("chenronghua") d.eat("包子")
運行如下:
Traceback (most recent call last):
File "/home/zhuzhu/第七天/static_method.py", line 10, in <module>
d.eat("包子")
TypeError: eat() missing 1 required positional argument: 'food'
從上面運行結果可以看出,加上@staticmethod之後,代碼就執行錯誤了,提示eat()少了一個參數。
下麵我們給eat()方法傳入兩個參數,如下:
class Dog(object): def __init__(self,name): self.name = name @staticmethod def eat(self,food): print("%s is eating %s" %(self,food)) d = Dog("chenronghua") d.eat("chenronghua","包子")
運行如下:
chenronghua is eating 包子
從上面結果可以看出,加入參數之後,執行eat()方法是沒有問題的,從中可以看出,加上@staticmethod之後,eat()變成靜態方法了,本來eat()方法是能夠接收self.name中類的屬性的,現在不可以了,只能自己傳遞參數進來,說明跟類沒有太多關係了,截斷了與類的關係,eat()成為一個單獨的函數,要自己傳遞函數,與類沒有太多的關係,但是必須通過類來進行調用,不能獨自在外面調用,必須通過類來進行調用,@staticmethod方法與我們跟臺灣的關係一樣,名義上屬於中國,但是大陸有管不了臺灣。名義屬於,但是不能調用。
靜態方法:只是名義上歸類管理,實際上靜態方法里訪問不了類或實例中的任何屬性。
類方法
類方法通過@classmethod裝飾器實現,類方法和普通方法的區別是, 類方法只能訪問類變數,不能訪問實例變數
class Dog(object): def __init__(self,name): self.name = name @classmethod def eat(self): print("%s is eating" %self.name) def talk(self): print("%s is talking" %self.name) d = Dog("chenronghua") d.eat()
運行結果如下:
Traceback (most recent call last):
File "/home/zhuzhu/第七天/class_method.py", line 14, in <module>
d.eat()
File "/home/zhuzhu/第七天/class_method.py", line 7, in eat
print("%s is eating" %self.name)
AttributeError: type object 'Dog' has no attribute 'name'
上面代碼中,我們把@staticmethod換成@classmethod,我們知道@staticmethod是把類方法變成單獨的函數,只能通過傳遞參數,名義上屬於類,但是不能調用類中的屬性和方法,現在@calssmethod也報錯,說Dog類中沒有name屬性,我們知道,我們在裡面定義了名字,說明@calssmethod也對類進行了修改。不能直接調用實例的屬性。
class Dog(object): n = 666 def __init__(self,name): self.name = name @classmethod def eat(self): print("%s is eating" %self.n) def talk(self): print("%s is talking" %self.name) d = Dog("chenronghua") d.eat()
運行結果如下:
666 is eating
從上面可以看出,@classmethod是讓類方法只能調用類的屬性,不能調用實例的屬性,類方法的作用就是這個。不能在調用實例屬性。
類方法:類方法只能方位類變數,不能訪問實例變數
屬性方法
屬性方法的作用就是通過@property把一個方法變成一個靜態屬性
class Dog(object): def __init__(self,name): self.name = name @property #屬性,attribute def eat(self): print("%s is eating" %self.name) def talk(self): print("%s is talking" %self.name) d = Dog("chenronghua") d.eat()
運行結果如下:
chenronghua is eating
Traceback (most recent call last):
File "/home/zhuzhu/第七天/property屬性.py", line 15, in <module>
d.eat()
TypeError: 'NoneType' object is not callable
上面,我們在eat()方法上面加上@property,可以看出,還是不能執行的,說NoneType不能調用。下麵,我們去掉調用的括弧,如下:
class Dog(object): def __init__(self,name): self.name = name @property #屬性,attribute def eat(self): print("%s is eating" %self.name) def talk(self): print("%s is talking" %self.name) d = Dog("chenronghua") d.eat
運行結果如下:
chenronghua is eating
從上面可以看出,代碼執行沒有錯誤,正常執行,說明@property是把方法變成了屬性,本來方法eat()是要加括弧才能執行的,現在不要加括弧就可以執行,變成了一個方法。那麼遇到參數的情況要怎麼辦呢?
class Dog(object): def __init__(self,name): self.name = name @property #屬性,attribute def eat(self,food): print("%s is eating" %self.name) def talk(self): print("%s is talking" %self.name) d = Dog("chenronghua") d.eat = "dd"
運行結果如下:
Traceback (most recent call last):
File "/home/zhuzhu/第七天/property屬性.py", line 15, in <module>
d.eat = "dd"
AttributeError: can't set attribute
屬性是不能傳入參數的,也不能設置屬性。
class Dog(object): def __init__(self,name): self.name = name @property #屬性,attribute def eat(self,food): print("%s is eating" %self.name) def talk(self): print("%s is talking" %self.name) @eat.setter def eat(self,food): print("set to food:",food) d = Dog("chenronghua") d.eat = "dd"
@property是把類方法變成屬性,通過屬性進行調用,要先傳值,比如在定義一個同名函數@eat.setter就能實現對實例傳值d.eat = "dd"。
每個人都有自己的道路,不要羡慕別人,路不止一條,很多時候,我們走的路都是錯的,都是按照別人的要求走的路,我們要走自己的路,一步一步。不要跟別人對比。相信努力堅持總會有收穫,收穫大小沒關係,不是每個人都是能稱為比爾蓋茨。我們每個人都沒有資格評論別人的生活,快樂不快樂不是一個人能夠去評論的。不要去指導別人。生活沒有對與錯,有些目標能夠實現只要自己堅持,有些目標即便自己堅持也是實現不了的。比如完美的身材,只要通過堅持鍛煉,都會得到大塊肌肉,沒有贅肉的身體。這個世界,永遠都是百分之二十的人掌握百分之八十的財富。這個任何人改變不了,即便在努力很多人也達不到。只能堅持不懈,不斷改變自己。即便永遠成功不了,但是我們能在不斷努力的道路上不斷完善自己,提升自己。沒必要羡慕別人的成功,只要自己在成長,在不斷努力,不斷前進,走好自己的人生就好。
屬性方法
把一個方法變成一個靜態屬性