我有一个描述符存储在主机对象的字典中的数据。 我有这样的描述符类层次结构具有相同名称的字段: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