Python中@property和@classmethod和@staticmethod
前戲
首先,先要弄清楚一個類裏面的,各個組成部分都應該怎麽稱呼。
- 註:可能叫法會不太一樣。
關於@property
顧名思義:它的意思為‘屬性’。
作用:
1:使用它你將會把類方法,變為類屬性。並且是只讀屬性。
2:它會重新實現getter和setter方法。
看代碼:
class Person: def __init__(self,first_name,last_name): self.first_name = first_name self.last_name = last_name @propertydef full_name(self): return (‘%s??%s‘%(self.first_name,self.last_name)) #用法 # 實例化類對象 person = Person(‘狗‘, ‘ride‘) # 調用類下面的字段 print(person.first_name) print(person.last_name) # 調用類下面加過property裝飾器的方法。 print(person.full_name) # 不需要加括號哦!!!因為我有property # 輸出結果: # 狗 # ride # 狗??ride # 字段賦個值,看是否可以。person.first_name = ‘ri‘ person.last_name = ‘狗地‘ print(person.full_name) # 輸出結果:ri??狗地 # 給屬性賦值 person.full_name = ‘gougou‘ #Traceback (most recent call last): # File "/property.py", line 37, in <module> # person.full_name = ‘ff‘ # AttributeError: can‘t set attribute
# 在此驗證了它的只讀屬性哦
因為我們將方法通過加@property變成了屬性。(因此這裏我們可以通過調用靜態屬性的方法,來調用屬性)
But,屬性是只讀的!!!不可以將該屬性設為其他值。
第二個功能
代碼示例:
from decimal import Decimal ################################################# class Fees(object): #---------------------------------------------------------------------- def __init__(self): """Constructor""" self._fee = None #---------------------------------------------------------------------- def get_fee(self): """ Return the current fee """ return self._fee #---------------------------------------------------------------------- def set_fee(self, value): """ Set the fee """ if isinstance(value, str): self._fee = Decimal(value) elif isinstance(value, Decimal): self._fee = value
fee = property(get_fee, set_fee)
>>> f = Fees()
>>> f.set_fee("1")
>>> f.fee
Decimal(‘1‘)
>>> f.fee = "2"
>>> f.get_fee()
Decimal(‘2‘)
當我們以這種方式使用屬性函數時,它允許fee屬性設置並獲取值本身而不破壞原有代碼。讓我們使用屬性裝飾器來重寫這段代碼,看看我們是否能得到一個允許設置的屬性值。
1 from decimal import Decimal 2 3 ################################################# 4 5 class Fees(object): 6 """""" 7 8 #---------------------------------------------------------------------- 9 def __init__(self): 10 """Constructor""" 11 self._fee = None 12 13 #---------------------------------------------------------------------- 14 @property 15 def fee(self): 16 """ 17 The fee property - the getter 18 """ 19 return self._fee 20 21 #---------------------------------------------------------------------- 22 @fee.setter 23 def fee(self, value): 24 """ 25 The setter of the fee property 26 """ 27 if isinstance(value, str): 28 self._fee = Decimal(value) 29 elif isinstance(value, Decimal): 30 self._fee = value 31 32 #---------------------------------------------------------------------- 33 if __name__ == "__main__": 34 f = Fees() 35 36 # 上面的代碼演示了如何為fee屬性創建一個setter方法。你可以用一個名為@fee.setter的# 裝飾器裝飾第二個方法名也為fee的方法來實現這個。當你如下所做時,setter被調用: 37 38 >>> f = Fees() 39 >>> f.fee = "1"@fee.setter
如果你想對屬性使用del命令,你可以使用@fee.deleter創建另一個裝飾器來裝飾相同名字的函數從而實現刪除的同樣效果。
關於@classmethod和@staticmethod
一般來說,要使用某個類的方法,需要先實例化一個對象再調用方法。
而使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調用。
這有利於組織代碼,把某些應該屬於某個類的函數給放到那個類裏去,同時有利於命名空間的整潔。
既然@staticmethod和@classmethod都可以直接類名.方法名()來調用,那他們有什麽區別呢
從它們的使用上來看,
- @staticmethod不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。
- @classmethod也不需要self參數,但第一個參數需要是表示自身類的cls參數。
如果在@staticmethod中要調用到這個類的一些屬性方法,只能直接類名.屬性名或類名.方法名。
而@classmethod因為持有cls參數,可以來調用類的屬性,類的方法,實例化對象等,避免硬編碼。
Python中@property和@classmethod和@staticmethod