2011-03-17 72 views
3

我有一個描述符存儲在主機對象的字典中的數據。 我有這樣的描述符類層次結構具有相同名稱的字段: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提供的屬性解決方案不適合我的需求 - 我需要將我所有的描述符都包裝在適當的位置。

回答

1

當然A.f.__set__(b,'a')會工作,如果A.__dict__['f'].__set__(b,'a')的作品? 然後即使A.f.b = 'a'工作,但如果我的記憶爲我服務,您可能必須將其指定爲屬性。


見歷史看到一個巨大的brainfart ...

>>> class ADescriptor(object): 
    def __init__(self, keyname='descr'): 
     self.keyname = keyname 
    def __get__(self, obj, objtype): 
     return (self.keyname, 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') 


>>> a, b = A(), B() 
>>> print (a.f, b.f, A.f, B.f) 
(('keyA', 8192), ('keyB', 8192), ('keyA', 8192), ('keyB', 8192)) 
>>> b.f = 'b' 
>>> print (a.f, b.f, A.f, B.f) 
(('keyA', 8192), ('keyB', 'b'), ('keyA', 8192), ('keyB', 8192)) 
>>> A.f = 'a' 
>>> print (a.f, b.f, A.f, B.f) 
('a', ('keyB', 'b'), 'a', ('keyB', 8192)) 
>>> 

這就是你吧? (我改變了__get__進行調試,應該改回原來的樣子)

你想用超級做什麼?

+0

感謝BiggAl,它的工作,至少你給了我正確的方向。 – tuvastamata 2011-03-17 12:02:09

+0

@tuvastamata:很高興聽到它,如果這回答你的問題,請你能標記它嗎?否則,請詳細說明你需要什麼? – theheadofabroom 2011-03-17 12:06:49

+0

@BiggAl,需要較少的修改,讓了Af被評估成需要ADescriptor實例: DEF __get __(個體,OBJ,OBJTYPE =無): 如果不是OBJ:#return描述符本身如果給 返回自 返回沒有裝訂物getattr(obj,self.keyname,8192) 在這種情況下,Afb完美無缺,無需財產! – tuvastamata 2011-03-17 12:09:37