Форум сайта python.su
0
В какой то момент мне понадобился базовый класс от которого можно будет унаследовать механизм присвоения уникальных айди, и механизм хранения всех обьектов.
Пишем абстрактный класс с двумя классовыми свойствами
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
from abc import ABCMeta class MyMeta(ABCMeta): def __init__(cls, name, bases, dct): super(MyMeta, cls).__init__(name, bases, dct) cls.allInstances = set()
Офлайн
0
Админы, может перенесите тему в раздел “Для новичков”?
Офлайн
186
> Получается что для дочкрних классов отдельно были созданы класовые свойства для nextId но allInstances одна на всех и хранит обьекты всех дочерних классов. Может кто нибудь обьяснить почему так происходит?
А чему ты удивляешся? У тебя nextId и allInstances - атрибуты класса т.е. они общие для всех его экземпляров, а idNumber это обычный атрибут.
Офлайн
0
Rodegast
А чему ты удивляешся? У тебя nextId и allInstances - атрибуты класса т.е. они общие для всех его экземпляров, а idNumber это обычный атрибут.
Офлайн
568
Не очень понятен ваш вопрос.
У вас код не соответствует выводу
вот код
>>> child1_instance1 = Child1("child1_instance1“)
>>> child1_instance2 = Child1(”child1_instance2“)
>>> child1_instance2 = Child2(”child1_instance2“)
>>> child2_instance2 = Child2(”child2_instance2")
вот вывод
child1_instance1
child1_instance2
child2_instance2
child1_instance2
Вы где-то чего-то напутали кажется
Офлайн
186
self.idNumber = self.__class__.nextId self.__class__.nextId += 1
Отредактировано Rodegast (Сен. 30, 2015 10:52:28)
Офлайн
0
Спасибо за ответы
Офлайн