如何获取对python中实现描述符对象的所有类的引用

时间:2013-12-26 12:02:34

标签: python metaprogramming

我正在创建一个描述符,我想在其中创建一个列表,该列表包含对实现它的所有对象的引用,它应该是某种快捷方式,我可以在下一个实例上调用该方法。实例。

我能找到的唯一愚蠢的解决方案就是在每个对象的__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>]

1 个答案:

答案 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