假设我有一个名为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]
答案 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