【发布时间】:2013-12-26 12:02:33
【问题描述】:
我正在创建一个描述符,我想在其中创建一个列表,其中包含对所有实现它的对象的引用,它应该是某种快捷方式,我可以在其中调用下一个实例的方法实例。
我能找到的唯一愚蠢的解决方案是在每个对象的__init__ 上触发将项目添加到列表的描述符上的设置器,即使该解决方案确实有效,但我可以感觉到它有问题。
除了在__init__ 上设置任意值之外,是否有更好的方法将类实例添加到描述符列表中,只是为了触发设置器?
class GetResult(object):
def __init__(self, value):
self.instances = []
def __get__(self, instance, owner):
return self
def __set__(self, instance, value):
self.instances.append(instance)
def getInstances(self):
return self.instances
class A(object):
result = GetResult(0)
def __init__(self):
self.result = 0
def getAll(self):
print self.result.getInstances()
a1 = A()
a2 = A()
a3 = A()
print a2.result.getInstances()
>> [<__main__.A object at 0x02302DF0>, <__main__.A object at 0x02302E10>, <__main__.Aobject at 0x02302E30>]
【问题讨论】:
-
您能否用一些代码来说明您的问题,例如可以工作但您认为不太理想的代码。
-
除非您要将相同的描述符对象粘贴到多个类上,否则只需将实例列表放在类上而不是描述符上就可以了。
-
另一方面,如果您想为所有带有
GetResult描述符的对象创建一个列表,即使它们使用GetResult的不同实例,您可能希望粘贴实例列表到GetResult类。您可以尝试使用类装饰器或元类将必要的逻辑添加到__init__,如果您这样做,还可能添加描述符。 -
是的,布鲁诺在下面的回复中提到了同样的原则,我想如果没有其他想法,我可能会直接采用。