classlazyproperty:
def__init__
(self, func):
self.func =func
def__get__
(self, instance, owner):
print('
這是我們自己定製的靜態屬性,r1.area實際是要執行r1.area()')
if instance is
none:
return self #
如果沒有傳進例項,那就返回area -- > area=lazyproperty(area)
else
:
print('
--->')
value = self.func(instance) #
是描述符幫我們實現了自動傳值
setattr(instance, self.func.__name__, value) #
計算一次就快取到例項的屬性字典中
return
value
class
room:
def__init__
(self, name, width, length):
self.name =name
self.width =width
self.length =length
@lazyproperty
#area=lazyproperty(area) 相當於'定義了乙個類屬性,即描述符'
defarea(self):
return self.width *self.length
r1 = room('
alex
', 1, 1)
print(r1.area) #
先從自己的屬性字典找,沒有再去類的中找,然後出發了area的__get__方法
print(r1.area) #
先從自己的屬性字典找,找到了,是上次計算的結果,這樣就不用每執行一次都去計算
如果給lazyproperty加了__set__,那就會變成資料描述符,資料描述符的優先順序是大於例項屬性的,這樣就會去呼叫資料描述符,快取就失效了。
神奇的描述符(一) 描述符協議的實現
描述符通過描述符協議實現,任何實現或部分實現以下方法的類,都可以作為描述符使用。def get self,instance,owner def set self,instance,value def delete self,instance get 方法接收三個引數 self為描述符例項自身 ins...
ES5 資料屬性描述符和訪問描述符
物件是乙個屬性集合,物件的基本特徵是屬性名 name 和屬性值 value es5 增加了屬性描述符,可以更細膩的控制屬性的不同操作。屬性描述符有 configurable writable 和 enumerable。屬性描述符通常和 object.defineproperty object.def...
描述符和char 的轉換
今日從newlc 學習了一下描述符和字串的轉化,總結一下,方法有如下幾種 描述符 unsigned char 所有派生自tdes16的描述符 例如tbuf 均可以通過ptrz 函式轉化。ptrz 函式返回乙個以null結束的unsigned int 也就是強制轉化為unsigned char uns...