<p>如果你真的想这样做,你必须将它设计到你的模型中,这样,例如,你就有了一个所有创建的汽车的注册表。你知道吗</p>
<p>这不是一件困难的事情-我认为最明显的方法是定制
<code>__new__</code>方法来保留该注册表,并进行调用:</p>
<pre><code>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")
</code></pre>
<p>另一种方式,因为这是类级别的东西,应该保留
创建类时,可以在元类中处理。
好处:它是“纯”的,当您像上面那样实例化该类的第一个对象时,您不会有特殊的处理。
缺点:具有不同元类的类很难组合-而且
如果您有一个类层次结构,其中有些类需要这种行为,而有些类不需要这种行为,那么在类级别这样做可以保持所有内容的可互换性。你知道吗</p>
<p>实际上,请注意,创建超类<code>Base</code>是一个可选步骤。如果您在所有项目中只在一个地方使用它,那么逻辑很可能在<code>car</code>类本身内部(正如Narcise的回答,bellow)</p>
<p>如果不想这样做,可以使用垃圾收集器(<code>gc</code>)模块找出对象的所有实例,并对它们调用方法。我不认为这是一个冰的事情,因为<code>gc</code>本身就是一个冰
cPython的实现细节。你知道吗</p>
<pre><code>import gc
...
for obj in gc.get_referrers(car):
if not isinstance(obj, car): continue
obj.drive()
</code></pre>
<p>或者在一条丑陋的单行线上:</p>
<pre><code>[getattr(obj, "drive")() for obj in gc.get_referrers(car) if isinstance(obj, car)]
</code></pre>