自动将新创建的对象添加到列表中

时间:2015-06-11 12:46:15

标签: python

假设我有一个名为A的类,我想列出从该特定类创建的所有对象。这就是我到目前为止所做的事情,它提出AttributeError: type object 'A' has no attribute 'items'如何做到这一点?

class A:
    def __init__(self):
        self.items = []
        self.items.append(self)

    @classmethod
    def list_objects(cls):
        return cls.items


a = A()
b = A()
print(A.list_objects())

# Expected output is [a,b]

2 个答案:

答案 0 :(得分:6)

您需要列表位于类级别,而不是实例级别

class A:
    items = []

    def __init__(self):
        A.items.append(self)

    @classmethod
    def list_objects(cls):
        return cls.items

然后你会看到

>>> a = A()
>>> b = A()
>>> A.list_objects()
[<__main__.A object at 0x02B77230>, <__main__.A object at 0x02B772D0>]

答案 1 :(得分:1)

代码的问题出在self.items = []部分,因为您为您创建的每个类items初始化了一个新的A空列表。因此,在您的情况下,类A的每个对象都将有一个实例成员items,仅包含自身。

首先,您需要将items列表移至班级,然后在__init__self添加到该列表中。

如果您打算在许多课程中使用此功能,我建议您使用以下解决方案:

@track_objects
class A:
    def __init__(self):
        pass  # your init code here

>>> a = A()
>>> b = A()
>>> A.items
[<__main__.A instance at 0x1004873f8>, <__main__.A instance at 0x100487488>]

这是@track_objects实施:

def track_objects(klass):
    klass.items = []
    orig_init = klass.__init__

    def init_wrapper(self, *args, **kwargs):
        self.items.append(self)

        return orig_init(self, *args, **kwargs)
    klass.__init__ = init_wrapper

    return klass