@Staticmethod、@Classmethod和@Property類裝飾器
@staticmethod 與 @classmethod在Python中稱為 裝飾器,用來修飾函數,相當于添加一個額外的功能,不再像普通函數那樣進行實例化。
@staticmethod和@classmethod
其實@staticmethod和@classmethod都是用來聲明靜態方法的。只不過一個聲明靜態方法,一個聲明類方法。
靜態方法:使用裝飾器@staticmethod。沒有self和cls參數。
類方法:使用裝飾器@classmethod。第一個參數為當前類的對象,通常為cls。
為了方便大家了解兩者的差別,以下的示例代碼將有助于發現其中的差別:
- '''
- @Author:Runsen
- @微信公眾號: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)
- # 實例對象同樣運行
- 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 中要調用到這個類的一些屬性方法,只能直接 類名.屬性名或 類名.方法名。而 @classmethod 因為持有cls參數,可以通過cls來調用類的屬性,類的方法,實例化對象等,避免硬編碼。
@property
@property可以將一個方法的調用變成屬性調用。舉例說明:平時我們調用數據屬性和方法,是這樣的
- class School():
- name = "家里蹲大學"
- def test(self):
- print("實例方法")
- @property
- def test_pro(self):
- print("靜態屬性")
- if __name__ == "__main__":
- s = School()
- print(s.name)
- s.test()
- # 輸出如下
- 家里蹲大學
- 實例方法
這時就要用到@preperty裝飾器,該裝飾器能夠讓一個方法變成屬性調用。
- class School():
- name = "家里蹲大學"
- def test(self):
- print("實例方法")
- @property
- def test_pro(self):
- print("靜態屬性")
- if __name__ == "__main__":
- s = School()
- print(s.name)
- # 注意返回的函數 千萬別加()
- s.test_pro
- # 輸出如下
- 家里蹲大學
- 靜態屬性
從今天以后,在Python編程中,@property廣泛應用在Python類的定義中非常常見。你一看到@property,第一反應就是:@property專門負責把一個方法變成同名屬性的。
本文已收錄 GitHub,傳送門~[1] ,里面更有大廠面試完整考點,歡迎 Star。
Reference
[1]傳送門~:
https://github.com/MaoliRUNsen/runsenlearnpy100