1. 程式人生 > 其它 >基於描述符和裝飾器實現延遲計算

基於描述符和裝飾器實現延遲計算

背景:

  python 內建的property裝飾器可以將方法裝飾為屬性, 但每次呼叫時都會執行一遍, 假如該屬性被頻繁呼叫,則會出現沒必要的重複執行

優化邏輯:

  利用@語法糖的特性, 將屬性交給描述符代理,第一次呼叫就將屬性新增到例項字典中, 當例項下一次呼叫時,可以直接從它的字典中獲取值, 而無需再經過運算。(注意:定義的描述符必須是非資料描述符, 即沒有實現__set__方法,因為優先順序順序為:資料描述符 > 例項屬性 > 非資料描述符)

程式碼如下:

 1 # descriptor & decorator
 2 class LazyProperty:
 3
def __init__(self, func): 4 self.func = func 5 6 def __get__(self, instance, cls): 7 # print("Only Execute one time...") 8 instance.area = self.func(instance) 9 return instance.area 10 11 12 class Room: 13 def __init__(self, width, height): 14 self.width = width
15 self.height = height 16 17 @LazyProperty # ===> area = LazyProperty(area) 18 def area(self): 19 return self.width * self.height 20 21 r1 = Room(19, 28) 22 print(r1.area) 23 print(r1.__dict__) 24 print(r1.area)
test.py