@Staticmethod、@Classmethod和@Property類裝飾器
@staticmethod 與 @classmethod在Python中稱為 裝飾器,用來(lái)修飾函數(shù),相當(dāng)于添加一個(gè)額外的功能,不再像普通函數(shù)那樣進(jìn)行實(shí)例化。
@staticmethod和@classmethod
其實(shí)@staticmethod和@classmethod都是用來(lái)聲明靜態(tài)方法的。只不過(guò)一個(gè)聲明靜態(tài)方法,一個(gè)聲明類方法。
靜態(tài)方法:使用裝飾器@staticmethod。沒(méi)有self和cls參數(shù)。
類方法:使用裝飾器@classmethod。第一個(gè)參數(shù)為當(dāng)前類的對(duì)象,通常為cls。
為了方便大家了解兩者的差別,以下的示例代碼將有助于發(fā)現(xiàn)其中的差別:
- '''
- @Author:Runsen
- @微信公眾號(hào):Python之王
- @博客:https://blog.csdn.net/weixin_44510615
- @Date:2020/8/30
- '''
- class A():
- # 類的屬性
- x = 1
- @classmethod
- def get_name(cls, name):
- print(cls.x)
- print('my name is %s' % name)
- @staticmethod
- def get_age(age):
- print(A.x)
- print(f'i am %s years old' % age)
- if __name__ == '__main__':
- A.get_name('Runsen')
- A.get_age(20)
- # 實(shí)例對(duì)象同樣運(yùn)行
- a = A()
- a.get_name('Runsen')
- a.get_age(20)
- #輸出如下
- 1
- my name is Runsen
- 1
- i am 20 years old
- 1
- my name is Runsen
- 1
- i am 20 years old
如果在 @staticmethod 中要調(diào)用到這個(gè)類的一些屬性方法,只能直接 類名.屬性名或 類名.方法名。而 @classmethod 因?yàn)槌钟衏ls參數(shù),可以通過(guò)cls來(lái)調(diào)用類的屬性,類的方法,實(shí)例化對(duì)象等,避免硬編碼。
@property
@property可以將一個(gè)方法的調(diào)用變成屬性調(diào)用。舉例說(shuō)明:平時(shí)我們調(diào)用數(shù)據(jù)屬性和方法,是這樣的
- class School():
- name = "家里蹲大學(xué)"
- def test(self):
- print("實(shí)例方法")
- @property
- def test_pro(self):
- print("靜態(tài)屬性")
- if __name__ == "__main__":
- s = School()
- print(s.name)
- s.test()
- # 輸出如下
- 家里蹲大學(xué)
- 實(shí)例方法
這時(shí)就要用到@preperty裝飾器,該裝飾器能夠讓一個(gè)方法變成屬性調(diào)用。
- class School():
- name = "家里蹲大學(xué)"
- def test(self):
- print("實(shí)例方法")
- @property
- def test_pro(self):
- print("靜態(tài)屬性")
- if __name__ == "__main__":
- s = School()
- print(s.name)
- # 注意返回的函數(shù) 千萬(wàn)別加()
- s.test_pro
- # 輸出如下
- 家里蹲大學(xué)
- 靜態(tài)屬性
從今天以后,在Python編程中,@property廣泛應(yīng)用在Python類的定義中非常常見(jiàn)。你一看到@property,第一反應(yīng)就是:@property專門負(fù)責(zé)把一個(gè)方法變成同名屬性的。
本文已收錄 GitHub,傳送門~[1] ,里面更有大廠面試完整考點(diǎn),歡迎 Star。
Reference
[1]傳送門~:
https://github.com/MaoliRUNsen/runsenlearnpy100