我使用Python时很新,但找不到答案。
让我们知道我有一个代码:
class numbers():
def __init__(self,a,b):
self._a = a
self._b = b
def add(self):
self._suma = self._a + self._b
之后,我创建了很多数字的实例:
obj1 = numbers(1,2)
obj2 = numbers(7,16)
...
然后,我想以简单而干净的方式在类数字的所有对象中调用 add 方法。
请注意,如果我实例化数字类1000次,我不想写1000次这个
objX.add()
我在网上寻找答案,我发现,在其他语言中,他们将对象的所有名称都放在一个字符串中,然后在调用方法时迭代它。 问题是我不知道如何在python中做到这一点,也不是解决这个问题的最佳方法。
谢谢
答案 0 :(得分:1)
您需要找到所有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()
这会查询当前名称空间中的所有对象,以查看它们是否Number
。这样做的问题是你失去了封装。您可能不希望通过调用number
来依赖您的函数来查找globals()
对象。相反,让我们给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()
答案 1 :(得分:1)
创建一个对象列表。
objs = []
将元素添加到此列表
obj1 = numbers(1,2) # say these are your objects
obj2 = numbers(7,16)
...
objs.append(obj1) # add them to the list
为列表中的每个元素调用add方法
for obj in objs:
obj.add() # call the add method.