【问题标题】:Calling the same method in all the objects from a class在一个类的所有对象中调用相同的方法
【发布时间】:2015-09-24 08:07:24
【问题描述】:

我是使用 Python 的新手,找不到答案。

假设我有这样的代码:

class numbers():
   def __init__(self,a,b):
   self._a = a
   self._b = b

   def add(self):
   self._suma = self._a + self._b

之后,我创建了很多 numbers 的实例:

obj1 = numbers(1,2)
obj2 = numbers(7,16)
...

然后,我想在类numbers的所有对象中以简单干净的方式调用add方法。

请注意,如果我将 numbers 类实例化 1000 次,我不想写 1000 次

objX.add()

我在网上寻找答案,我发现在其他语言中,他们将所有对象的名称放在一个字符串中,然后对其进行迭代调用该方法。 问题是我不知道如何在 python 中做到这一点,也不知道它是否是解决这个问题的最佳方法。

谢谢

【问题讨论】:

  • 你可以有一个名为objs的对象列表,其中objs[0]是第0个numbers对象,objs[1]是第1个numbers对象,等等。然后简单地说,@987654329 @

标签: python loops object methods


【解决方案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.

【讨论】:

    【解决方案2】:

    你需要有一些方法来找到所有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()
    

    这会查询当前在命名空间中的所有对象以查看它们是否为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()
    

    【讨论】:

    • 很好,这是一个“深入”的解释。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多