在类的所有对象中调用相同的方法

时间:2015-07-07 01:37:26

标签: python loops object methods

我使用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中做到这一点,也不是解决这个问题的最佳方法。

谢谢

2 个答案:

答案 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)

现在我们有三个对象abc,它们都是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.