В какой то момент мне понадобился базовый класс от которого можно будет унаследовать механизм присвоения уникальных айди, и механизм хранения всех обьектов.
Пишем абстрактный класс с двумя классовыми свойствами
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?
Updated 30 Sept. 2015, 10:06 by azazell00.