Метод в метаклассе, который вызывается, когда каждый новый экземпляр его "аффилированных" классов равен __call__
.Если вы поместите в него код для записи экземпляров, это все, что вам нужно:
from weakref import WeakSet
# A convenient class-level descriptor to retrieve the instances:
class Instances:
def __get__(self, instance, cls):
return [x for x in cls._instances]
class Parallelizable(type):
def __init__(cls, name, bases, attrs, **kw):
super().__init__(name, bases, attrs, **kw)
cls._instances = WeakSet()
cls.instances = Instances()
def __call__(cls, *args, **kw):
instance = super().__call__(*args, **kw)
cls._instances.add(instance)
return instance
Тот же код будет работать вообще без дескриптора - это просто хороший способ получить классатрибут, который будет сообщать экземпляры.Но если WeakSet достаточно, этого кода достаточно:
from weakref import WeakSet
class Parallelizable(type):
def __init__(cls, name, bases, attrs, **kw):
super().__init__(name, bases, attrs, **kw)
cls.instances = WeakSet()
def __call__(cls, *args, **kw):
instance = super().__call__(*args, **kw)
cls.instances.add(instance)
return instance