1. 程式人生 > >Python中@property和@classmethod和@staticmethod

Python中@property和@classmethod和@staticmethod

return 被調用 命令 成了 aps display init 命名空間 類的方法

前戲

首先,先要弄清楚一個類裏面的,各個組成部分都應該怎麽稱呼。

  - 註:可能叫法會不太一樣。

   技術分享圖片


關於@property

顧名思義:它的意思為‘屬性’。

  作用:

    1:使用它你將會把類方法,變為類屬性。並且是只讀屬性。

    2:它會重新實現getter和setter方法。

  看代碼:

  

class Person:
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name

    @property
    
def 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