面向物件-類中的三個裝飾器
阿新 • • 發佈:2018-11-28
為了程式碼更加完善,引入幾個裝飾器..
裝飾類中的方法
-
@classmethod --->裝飾類方法,不用self屬性,只用類的cls屬性
-
@staticmethod --->裝飾靜態方法,既不用self屬性,又不用類cls的屬性
-
@property --->把一個方法偽裝屬性
下面具體說說他們的用法:
[email protected]裝飾類方法,那什麼是類方法呢?
在類中一個方法不用物件屬性,但使用靜態屬性,那這個方法就是類方法,被classmethod裝飾器裝飾的方法,都有一個預設的引數cls,這個引數就是當前類!
class A: __count = 0 def __init__(self,name): self.name = name self.__add_count() #只要執行init方法例項化物件就會產生呼叫 __add_count(),從而對靜態屬性__count操作 @classmethod def __add_count(cls): #私有方法 cls.__count += 1 #讓這個方法只能在內部被使用 @classmethod #被classmethod裝飾器裝飾的方法,都有一個預設的引數,這個引數就是當前類def show_count(cls): return cls.__count print(A.show_count()) # 0 類呼叫show_count方法檢視類的靜態屬性 Sheldon = A('Sheldon') # 例項化一個物件 print(Sheldon.show_count()) # 1 物件呼叫show_count方法檢視類的靜態屬性
可以看出呼叫類方法,可以用物件呼叫,也可以使用類呼叫
但是這個方法預設引數永遠是當前類的名稱空間,而不是物件的
[email protected]裝飾器裝飾靜態方法,什麼靜態方法呢?
如果一個類中的方法不使用物件屬性也不使用靜態屬性 -- 靜態方法,@staticmethod裝飾的這個方法實際上這個方法就是一個普通函式.
總結:
普通方法 類方法 靜態方法
預設引數 self cls 無
操作的變數 操作物件屬性 操作靜態屬性 既不操作物件屬性,也不操作類的屬性
所屬名稱空間 類 類 類
呼叫方式 物件 類/物件 類/物件
裝飾器 無 @classmethod @staticmethod
普通的方法 類方法 靜態方法 預設引數 self cls 無 操作的變數 操作物件的屬性 操作靜態屬性 既不操作物件屬性,也不操作類的屬性 所屬的名稱空間 類 類 類 呼叫方式 物件 類/物件 類/物件 對應的裝飾器 無 @classmethod @staticmethod
[email protected] 把一個方法偽裝成屬性
@name.setter 注意,setter 裝飾的函式名叫什麼,那麼在這個函式中絕對不可以對這個函式名同名屬性的修改
@name.deleter 呼叫方方法進行刪除屬性
示例1 from math import pi class Circle: def __init__(self,r): self.r = r @property # 把一個方法偽裝成屬性 def area(self): # 被property裝飾器裝飾的方法不能傳遞除self以外的引數 return pi*self.r**2 @property def perimeter(self): return self.r*pi*2 c1 = Circle(5) print(c1.area) c1.r = 10 print(c1.area) 呼叫的時候不用加()
示例2
class Person: def __init__(self,name): self.__name = name # 不讓外部隨便修改 @property def name(self): return self.__name Sheldon = Person('Sheldon') print(Sheldon.name) #這樣寫起到不容易被別人修改的作用
...