Наследование заданного атрибута класса в 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)
Другие вопросы по тегам