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