本章節主要講解python中內置裝飾器的使用,前面章節有詳細講解自定義裝飾器;
1.首先來說明什么是裝飾器?
答:python裝飾器本質上就是一個函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外的功能,
裝飾器的返回值也是一個函數對象
2.python內置裝飾器都有哪些?
答:特性裝飾器:@property 類方法裝飾器: @classmethod 靜態方法裝飾器:@staticmethod
3.系統裝飾器詳解:
3.1 @property 可以把一個實例方法變成其同名屬性,以支持實例訪問,它返回的是一個property屬性;
import math class Circle: def __init__(self,radius): #圓的半徑radius self.radius=radius @property def area(self): return math.pi * self.radius**2 #計算面積 @property def perimeter(self): return 2*math.pi*self.radius #計算周長
# 我們可以通過實例訪問到類中屬性
circle=Circle(10) print(circle.radius)
# 通過@property裝飾后的方法也可以像訪問數據屬性一樣去訪問area,會觸發一個函數的執行,動態計算出一個值; print(circle.area) print(circle.perimeter)
一個property對象還具有setter、deleter 可用作裝飾器;setter是設置屬性值。deleter用於刪除屬性值。而官方文檔中給出了getter用於獲取屬性信息,但是實際使用中可以直接通過property獲取屬性信息;
class C: def __init__(self): self._x = None @property def x(self): return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x #實例化類 c = C() # 為屬性進行賦值 c.x=100 # 輸出屬性值 print(c.x) # 刪除屬性 del c.x
總結:使用property:在設置屬性時,可以對值對進檢查,設置發生時,可以 修改設置的值,獲取屬性時,可以動態地計算值。
3.2 @classmethod 修飾的方法不需要實例化,不需要 self 參數,但第一個參數需要是表示自身類的 cls 參數,可以來調用類的屬性,類的方法,實例化對象等。
class A(): number = 10 @classmethod def get_a(cls): #cls 接收的是當前類,類在使用時會將自身傳入到類方法的第一個參數 print('這是類本身:',cls)# 如果子類調用,則傳入的是子類 print('這是類屬性:',cls.number) class B(A): number = 20 pass # 調用類方法 不需要實例化可以執行調用類方法 A.get_a() B.get_a()
3.3@staticmethod:改變一個方法為靜態方法,靜態方法不需要傳遞隱性的第一參數,靜態方法的本質類型就是一個函數 一個靜態方法可以直接通過類進行調用,也可以通過實例進行調用;
import time class Date: def __init__(self,year,month,day): self.year=year self.month=month self.day=day
@staticmethod def now(): #用Date.now()的形式去產生實例,該實例用的是當前時間 t=time.localtime() #獲取結構化的時間格式 return Date(t.tm_year,t.tm_mon,t.tm_mday) #新建實例並且返回
@staticmethod def tomorrow():#用Date.tomorrow()的形式去產生實例,該實例用的是明天的時間 t=time.localtime(time.time()+86400) return Date(t.tm_year,t.tm_mon,t.tm_mday)
a=Date('1987',11,27) #自己定義時間 print(a.year,a.month,a.day) b=Date.now() #采用當前時間 print(b.year,b.month,b.day) c=Date.tomorrow() #采用明天的時間 print(c.year,c.month,c.day)