我有一個描述符存儲在主機對象的字典中的數據。 我有這樣的描述符類層次結構具有相同名稱的字段:Python 2.6:如何訪問派生類隱藏的基類描述符字段?
class ADescriptor(object):
def __init__(self, keyname='descr'):
self.keyname = keyname
def __get__(self, obj, objtype):
return getattr(obj, self.keyname, 8192)
def __set__(self, obj, val):
setattr(obj, self.keyname, val)
class A(object):
f = ADescriptor('keyA')
class B(A):
f = ADescriptor('keyB')
b = B()
b.f = 'b'
print super(B,b).f
super(B,b).f = 'a'
最後行不起作用: 超(B,B).F =「A」
爲什麼要工作和類似的集合不? 我可以用比A更優雅的方式設置A的f。dict ['f']。 set(b,'a')?
更正:
在我最初的職位A.f給出一種形式的計算結果爲鍵名命名的(缺失)或默認的8192性能 - 沒有任何關係了。這就是爲什麼我用A. 字典 ['f'] - 排除得到調用。 小的修改被要求讓A.f被評估爲需要ADescriptor例如:
def __get__(self, obj, objtype=None):
if not obj: #return descriptor itself if no bound object given
return self
return getattr(obj, self.keyname, 8192)
在這種情況下A.f.__set__(b,'a')
作品。 但它仍然很醜! @BiggAl提供的屬性解決方案不適合我的需求 - 我需要將我所有的描述符都包裝在適當的位置。
感謝BiggAl,它的工作,至少你給了我正確的方向。 – tuvastamata 2011-03-17 12:02:09
@tuvastamata:很高興聽到它,如果這回答你的問題,請你能標記它嗎?否則,請詳細說明你需要什麼? – theheadofabroom 2011-03-17 12:06:49
@BiggAl,需要較少的修改,讓了Af被評估成需要ADescriptor實例: DEF __get __(個體,OBJ,OBJTYPE =無): 如果不是OBJ:#return描述符本身如果給 返回自 返回沒有裝訂物getattr(obj,self.keyname,8192) 在這種情況下,Afb完美無缺,無需財產! – tuvastamata 2011-03-17 12:09:37