Если вы действительно этого хотите, вы должны создать его в своей модели - так, например, у вас есть реестр всех созданных автомобилей.
Это не трудно, что нужно сделать - я думаю, что самый очевидный способ настроить метод __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
(как в ответе на Нарцисе, ниже).
Если вы не хотите этого делать , вы можете использовать модуль сбора мусора (gc
), чтобы узнать все экземпляры вашего объекта и вызвать метод на них. Я не думаю, что это было бы ледяной штукой, так как сама gc
представляет собой детальную реализацию реализации cPython для .
import gc
...
for obj in gc.get_referrers(car):
if not isinstance(obj, car): continue
obj.drive()
или некрасиво Oneliner:
[getattr(obj, "drive")() for obj in gc.get_referrers(car) if isinstance(obj, car)]
вы должны [следить за всеми экземплярами у вас есть] (http://stackoverflow.com/questions/12101958/keep-track-of-instances -in-python) –
Все сразу, вы имеете в виду параллельно? Или один за другим? –
Отмеченный код имеет синтаксическую ошибку. 'car1 = vehicles.car()' вызовет конструктор. – Paul