用描述符實現快取功能和property實現原理

2022-09-16 09:21:11 字數 1121 閱讀 5694

class

lazyproperty:

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...