对对象的所有实例调用方法

2024-09-30 04:26:55 发布

您现在位置:Python中文网/ 问答频道 /正文

class vehicles:
    class car:
        def drive():
            pass

car1 = car()
car2 = car()
car3 = car()

有没有一种方法可以在一次调用中调用所有汽车的drive函数,而不必显式地命名每一辆汽车。你知道吗


Tags: 方法函数defpassdrivecar命名汽车
3条回答

如果你真的想这样做,你必须将它设计到你的模型中,这样,例如,你就有了一个所有创建的汽车的注册表。你知道吗

这不是一件困难的事情-我认为最明显的方法是定制 __new__方法来保留该注册表,并进行调用:

class Base:
    def __new__(cls, *args, **kw):
        self = super.__new__(*args, **kw)
        if not hasattr(cls, _instances):
            cls._instances = []
        cls._instances.append(self)
        return self

    @classmethod
    def call_all(cls, method_name, *args, **kw):
        results = []
        for instance in cls._instances:
            results.append(getattr(instance, method_name)(*args, **kw))
        return results

    def __del__(self):
        self.__class__._instances.remoce(self)

class vehicles:
    class car(Base):

        def drive():
            pass

car1 = car()
car2 = car()
car3 = car()

car.call_all("drive")

另一种方式,因为这是类级别的东西,应该保留 创建类时,可以在元类中处理。 好处:它是“纯”的,当您像上面那样实例化该类的第一个对象时,您不会有特殊的处理。 缺点:具有不同元类的类很难组合-而且 如果您有一个类层次结构,其中有些类需要这种行为,而有些类不需要这种行为,那么在类级别这样做可以保持所有内容的可互换性。你知道吗

实际上,请注意,创建超类Base是一个可选步骤。如果您在所有项目中只在一个地方使用它,那么逻辑很可能在car类本身内部(正如Narcise的回答,bellow)

如果不想这样做,可以使用垃圾收集器(gc)模块找出对象的所有实例,并对它们调用方法。我不认为这是一个冰的事情,因为gc本身就是一个冰 cPython的实现细节。你知道吗

import gc

...
for obj in gc.get_referrers(car):
     if not isinstance(obj, car): continue
     obj.drive()

或者在一条丑陋的单行线上:

[getattr(obj, "drive")() for obj in gc.get_referrers(car) if isinstance(obj, car)]
class Vehicule():

      pos, child = 0, []

      def __init__(self):
          self.__class__.child.append(self)
          self.pos = self.__class__.pos
          self.__class__.pos +=1

      def cond(self):
          print self.pos

      @classmethod
      def drive(cls):
          for v in cls.child:
              v.cond()

测试:

t = Vehicule()
c = Vehicule()
g = Vehicule()
Vehicule.drive()

>>0
>>1
>>2

回答你的问题,是的,有办法。您可以使用class variable来跟踪实例。你知道吗

class vehicles:

    working_vehicles = [] # this is a class variable

    class car:
        def __init__(self):
            vehicles.working_vehicles.append(self) # adds itself to working_vehicles

        def drive(self):
            pass

然后可以创建实例,并从vehicles.working_vehicles访问它们。你知道吗

演示:

首先创建汽车:

>>> car1 = vehicles.car()
>>> car2 = vehicles.car()
>>> car3 = vehicles.car()

然后从vehicles.working_vehicles访问它们。你知道吗

>>> print(vehicles.working_vehicles)
[<__main__.vehicles.car object at 0x022DF6F0>, <__main__.vehicles.car object at 0x01E97ED0>, <__main__.vehicles.car object at 0x01EAA6B0>]

这在视觉上并没有什么帮助,但您可以调用所有汽车上的drive方法,如下所示:

>>> for car in vehicles.working_vehicles:
...     car.drive()

或在一行中:

>>> map(lambda car: car.drive(), vehicles.working_vehicles)

它不会立即驱动汽车。您需要在map迭代器上调用list。你知道吗

相关问题 更多 >

    热门问题