python 描述符 抽象類控制屬性訪問邏輯

2022-06-09 02:39:12 字數 2650 閱讀 1924

import abc

class auto_storage():

__counter = 0

def __init__(self):

cls = self.__class__

name = cls.__name__

self.storagename = '_{}#{}'.format(name,cls.__counter)

cls.__counter += 1

def __get__(self, instance, owner):

return getattr(instance,self.storagename) #返回乙個value

def __set__(self, instance, value):

setattr(instance,self.storagename,value) # setattr 相當於表示式:instance.__dict__[self.storagename] =value

# instance 均代表lineitem類的例項

#抽象類--模板,無法建立例項(繼承自abc抽象類)

class validated(abc.abc,auto_storage):

def __set__(self, instance, value):

value1 = self.validate(value) #這裡self.validate 方法引用 需要在set value之前對value進行驗證,所以我們需要重寫__set__方法

super().__set__(instance,value1)

#定義抽象方法,有子類quantity、noblank內的方法完成具體實現

@abc.abstractmethod

def validate(self,value): #對於validate 驗證資料,在validate中__set__方法覆蓋父類方法,其中已經引入instance,故而此處只需要輸入value引數就可以了

"# 驗證或者判斷值是否大於0 寫抽象辦法"

#具體實現驗證非負值

class quantity(validated): #get set分別繼承自auto_storage 類、validated類 --覆蓋描述符

def validate(self,value):

if value>0:

return value

else:

raise valueerror('value must > 0')

#具體實現驗證空字元

class noblank(validated): #get set分別繼承自auto_storage 類、validated類--覆蓋描述符

__counter = 0 # 引用名稱為:_auto_storage____counter

def __init__(self):

cls = self.__class__

name = cls.__name__

print(name)

self.storagename = '_{}##{}'.format(name,cls.__counter)

cls.__counter += 1

print( self.storagename)

class demo(auto_storage):

pass

class de(auto_storage):

pass

c = demo()

a = de()

c = demo()

c = demo()

圖示如下:類demo、de、auto_storage各自擁有名為父類原始名稱:_auto_storage____counter的類變數,所在上述實現**中 quantity類與noblank類是獨立進行類屬性計數

參考文章:python繼承關係中,類屬性的修改、python中的抽象類詳解:abstractmethod、abc與真實子類

python 描述 python描述符

在python中,訪問乙個屬性的優先順序順序按照如下順序 1.類屬性2.資料描述符3.例項屬性4.非資料描述符5.getattr 方法。描述符,用一句話來說,就是將某種特殊型別的類的例項指派給另乙個類的屬性 注意 這裡是類屬性,而不是物件屬性 而這種特殊型別的類就是實現了 get set delet...

python 描述符基本

相關資料 python的描述符 下一站,我等你 描述符的本質類 python為開發者提供了乙個非常強大的功能 描述符。那什麼是描述符呢?通過檢視python的官方文件,我們知道把實現了 get set 和 delete 中的其中任意一種方法的類稱之為描述符,描述符的本質是新式類,並且被 的類 即應用...

Python 描述符練習

要求 先定義乙個溫度類,然後定義兩個描述符用於描述攝氏度和華氏度兩個屬性 要求這個兩個屬性會自動進行轉換,也就是說你可以給攝氏度這個屬性賦值,然後列印的話華氏屬性是自動轉換的結果 class celsius def init self,value 26.0 self.value float valu...