你需要有一些方法来找到所有numbers 对象。为清楚起见,我将稍微调整您的代码命名约定,使其更加标准(根据 PEP9)。
class Number(object):
def __init__(self, a, b):
self._a = a
self._b = b
def add(self):
self.sum = self._a + self._b
return self.sum # not really sure where we're using it, so here?
a = Number(1, 2)
b = Number(2, 3)
c = Number(3, 4)
现在我们有了三个对象,a、b 和 c,它们都是 Number 对象。有两种方法可以获取它们的列表,一种非常糟糕。我们将首先讨论那个。
number_objs = [obj for obj in globals() if isinstance(obj, Number)]
for number in number_objs:
number.add()
这会查询当前在命名空间中的所有对象以查看它们是否为Numbers。这样做的问题是你失去了封装。您可能不想依赖您的函数通过调用globals() 来查找number 对象。相反,让我们给 Number 一个包含对象!
class NumberList(list):
# this is literally just a list, but we want to add one method:
def make_number(a, b):
number = Number(a, b)
self.append(number)
all_numbers = NumberList()
a = all_numbers.make_number(1, 2)
b = all_numbers.make_number(2, 3)
c = all_numbers.make_number(3, 4)
for number in all_numbers:
number.add()
或者,您可以给Number 一个类方法,它可以作为备用构造函数,但也可以将其添加到列表中。这可能是最干净的处理方式。
class Number(object):
def __init__(self, a, b):
self._a = a
self._b = b
def add(self):
self.sum = self._a + self._b
return self.sum
@classmethod
def track(cls, a, b, container):
n = cls(a, b)
container.append(n)
return n
all_numbers = []
a = Number.track(1, 2, all_numbers)
b = Number.track(2, 3, all_numbers)
c = Number.track(3, 4, all_numbers)
for number in all_numbers:
number.add()