2011-03-17 73 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