Наследование заданного атрибута класса в python
Я пытаюсь создать базовый абстрактный класс с механизмом сохранения множества всех созданных экземпляров.
class Basic(object):
__metaclass__ = ABCMeta
allInstances = set()
def __init__(self, name):
self.allInstances.add(self)
def __del__(self):
self.allInstances.remove(self)
Проблема в том, что набор allInstances
сохраняет экземпляры всех дочерних классов. Должен ли я добавить эти строки для каждого дочернего класса отдельно или есть способ создать наборы для каждого дочернего класса в базовом классе?
1 ответ
Решение
Спасибо, прочитав Ваш комментарий, несколько документов и статей, класс MyMeta:
from abc import ABCMeta
class MyMeta(ABCMeta):
def __init__(cls, name, bases, dct):
super(MyMeta, cls).__init__(name, bases, dct)
cls.allInstances = set()
родительский класс
from MyMeta import MyMeta
class Basic(object):
__metaclass__ = MyMeta
def __init__(self):
self.allInstances.add(self)
def __del__(self):
self.allInstances.remove(self)
По-другому
from abc import ABCMeta, abstractmethod
class Basic(object):
__metaclass__ = ABCMeta
allInstances = None
def __init__(self):
if self.__class__.allInstances is None:
self.__class__.allInstances = set()
self.__class__.allInstances.add(self)
def __del__(self):
self.__class__.allInstances.remove(self)