我正在创建一个描述符,我想在其中创建一个列表,其中包含对实现它的所有对象的引用,它应该是某种快捷方式,我可以在其中调用下一个实例的方法实例。
我能找到的唯一愚蠢的解决方案是在每个对象的 __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>]
最佳答案
如果这就是您的描述符所做的全部工作,则有点滥用描述符协议(protocol)。只是重写你的类 __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
关于python - 如何获得对在 python 中实现描述符对象的所有类的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20784474/