如何在python中动态添加和绑定描述符?
我想动态地将描述符绑定到类的属性 例如,我有一个描述符,它只是一个伪示例:如何在python中动态添加和绑定描述符?,python,class,getter-setter,Python,Class,Getter Setter,我想动态地将描述符绑定到类的属性 例如,我有一个描述符,它只是一个伪示例: class Item(object): def __init__(self, filename): self.filename = filename def __get__(self, obj=None, objtype=None): #print '__get__(%s, %s)' % (obj, objtype) return open(self.fi
class Item(object):
def __init__(self, filename):
self.filename = filename
def __get__(self, obj=None, objtype=None):
#print '__get__(%s, %s)' % (obj, objtype)
return open(self.filename).read()
def __set__(self, obj, val):
#print '__set__(%s, %s)' % (obj, val)
open(self.filename, 'w').write(str(val))
在我的主容器中,我想动态注册我的描述符
如果我在类级别实例化描述符,一切都会很好:
class Container(object):
foo = Item('foo')
bar = Item('bar')
不幸的是,当我尝试使用setattr动态关联描述符时,我需要给我的类增加更多的复杂性:
class Container(object):
def __init__(self, data):
for attr in data:
super(Container, self).__setattr__(attr, Item(attr))
def __setattr__(self, name, value):
#print '__setattr__(%s, %s)' % (name, value)
attr = super(Container, self).__getattribute__(name)
if hasattr(attr, '__set__'):
attr.__set__(name, value)
else:
super(Container, self).__setattr__(name, value)
def __getattribute__(self, name):
#print '__getattribute__(%s)' % (name)
attr = super(Container, self).__getattribute__(name)
if hasattr(attr, '__get__'):
return attr.__get__(name)
return attr
预期产出为:
>>> c = Container(['foo', 'bar'])
>>> c.foo = 2
>>> c.foo
'2'
有没有一个更简单的解决方案可以减少麻烦?所以,您的uu init_u_u_u___________________________。您遇到的问题: 在99.9%的情况下,你不应该直接调用magic dunder函数。所以,你的超级…。uuu setattr_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这件事没有理由 顺便说一句,根据我的经验,当人们开始使用描述符时,这是一种默认的障碍。以非动态方式使用描述符时
class Container(object):
foo = Item('foo')
bar = Item('bar')
您正在类的范围内设置foo和bar——字面上是类属性。但在你的动态方式中,你是用实例来做的。Idk,如果您试图将其设置为类,但如果这是一个意图,super不会这样工作。若要动态设置附加描述符,您需要将其附加到self在_init_;内引用的实例的类。要执行此操作,请访问self.\uuuuu类\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,您的代码可能看起来像
class Container(object):
def __init__(self, data):
for attr in data:
setattr(type(self), attr, Item(attr))
我用你的意见完全重写了这个问题。你能更新你的答案吗?我有一个类将被调用多次,每个类都应该有唯一的属性。有没有一种方法我可以做到这一点,而不用在_uinit__;中定义类?请为您的案例创建单独的问题,当您期望具体的答案时,很难回答抽象的问题;请不要。不要做一个傻子。使现有答案无效的主要编辑受到社区的反对。@AndrasDeak那么什么解决方案呢?我的问题是不清楚的,我不能删除它,我也不能在同一个错误的方向追求。我的要求不同。最终,最初的目标是一样的。我没有彻底阅读你的问题和编辑,我只看到一个4k代表用户问了一个问题,然后留下关于完全重写问题的评论,随后其中一个答案被删除。如果你认为原来的问题不清楚,现有的问答对也没有任何意义,那没关系。我只是想让你有意识地意识到重写问题的问题,因为太多的用户没有这样做。