我有一个描述符,用于在宿主对象的字典中存储数据。 我在类层次结构中有相同名称的字段:
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提供的属性解决方案对我的需求并不好 - 我需要将所有描述符包装在本地。
答案 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做什么?