2015-09-28 1 views
0

Я пытаюсь создать базовый абстрактный класс с механизмом сохранения множества всех созданных экземпляров.Наследование атрибута set class в python

class Basic(object): 
    __metaclass__ = ABCMeta 
    allInstances = set() 

    def __init__(self, name): 
     self.allInstances.add(self) 

    def __del__(self): 
     self.allInstances.remove(self) 

Проблема заключается в том, что набор allInstances сохраняет экземпляры всех дочерних классов. Должен ли я добавлять эти строки для каждого дочернего класса отдельно или есть способ создавать наборы для каждого дочернего класса в базовом классе?

+0

Мне нравится Marty Alchin-х [шаблон плагина] (http://martyalchin.com/2008/jan/10/simple-plugin-fra mework /) для таких вещей. –

+1

Если вы хотите иметь отдельный атрибут класса для каждого подкласса, который должен быть частью метакласса (который может наследовать от 'ABCMeta'). – jonrsharpe

+0

Интересно, когда я добавляю переменную целочисленного класса в мой класс 'Basic' (так же, как' allInstances' - он создается отдельно для каждого дочернего класса. Как это можно объяснить? – Azazell00

ответ

0

Thnx jonrsharpe, прочитав Ваш комментарий, некоторые документы и статьи, 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)