我正在创建一个描述符,我想在其中创建一个列表,该列表包含对实现它的所有对象的引用,它应该是某种快捷方式,我可以在下一个实例上调用该方法。实例。
我能找到的唯一愚蠢的解决方案就是在每个对象的__init__
上触发描述符上的setter,将项添加到列表中,即使该解决方案确实有效,我也能感觉到有问题它
有没有人有更好的方法将类实例添加到描述符列表而不是在__init__
上设置任意值,只是为了触发setter?
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>]
答案 0 :(得分:2)
如果这是你的所有描述符所做的,那就是滥用描述符协议。只是覆盖您的班级__new__
或__init__
会更简单:
class Foo(object):
_instances = []
def __new__(cls, *args, **kw):
instance = object.__new__(cls)
cls._instances.append(instance)
return instance
@classmethod
def get_instances(cls):
return self._instances