Пишем абстрактный класс с двумя классовыми свойствами
from abc import ABCMeta, abstractmethod class Basic(object): __metaclass__ = ABCMeta allInstances = set() nextId = 1 def __init__(self, name): self.name = name self.idNumber = self.__class__.nextId self.__class__.nextId += 1 self.allInstances.add(self) def __del__(self): self.allInstances.remove(self) @property def idNumber(self): return self._idNumber @idNumber.setter def idNumber(self, value): self._idNumber = value @property def name(self): return self._name @name.setter def name(self, value): self._name = value class Child1(Basic): pass class Child2(Basic):* pass
посмотрим как будут вести себя наши обьекты
>>> from Basic import *
>>> child1_instance1 = Child1("child1_instance1")
>>> child1_instance2 = Child1("child1_instance2")
>>> child1_instance2 = Child2("child1_instance2")
>>> child2_instance2 = Child2("child2_instance2")
for i in child1_instance1.allInstances:
print i.name
print i.idNumber
>>> for i in child1_instance1.allInstances:
... print i.name
... print i.idNumber
...
child1_instance1
1
child1_instance2
2
child2_instance2
2
child1_instance2
1
и тут я невольно задумался насколько хорошо я понимаю модель данных питона. Получается что для дочкрних классов отдельно были созданы класовые свойства для nextId но allInstances одна на всех и хранит обьекты всех дочерних классов.
Может кто нибудь обьяснить почему так происходит?
Добиться нужного повведения мне удалось создав свой мета класс унаследованный от ABCMeta
from abc import ABCMeta class MyMeta(ABCMeta): def __init__(cls, name, bases, dct): super(MyMeta, cls).__init__(name, bases, dct) cls.allInstances = set()
Может мне стоит все классовые свойства и весь механизм перенести в MyMeta?