Python 2.6:如何访问派生类隐藏的基类描述符字段?

时间:2011-03-17 07:33:37

标签: python super descriptor

我有一个描述符,用于在宿主对象的字典中存储数据。 我在类层次结构中有相同名称的字段:

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'

最后一行不起作用: super(B,b).f ='a'

为什么得到作品和类似的集合不? 我能否以比A更优雅的方式设置A的f。 dict ['f']。设置(b,'a')?


修正:

在我的初始帖子中给出的表格中,A.f评估为A的键名称属性(缺失)或默认8192 - 与它无关。这就是我使用A. dict ['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 个答案:

答案 0 :(得分:1)

如果A.f.__set__(b,'a')有效,A.__dict__['f'].__set__(b,'a')肯定会有用吗? 然后即使A.f.b = 'a'也可以工作,但如果我的记忆能为我服务,你可能不得不将其指定为财产。


查看历史,看看大量的脑力......

>>> 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__进行调试,应该将其改回原来的样式)

你想用super做什么?