#python #oop
Вопрос:
class Base: count = 0 def __init__(self): self.__class__.count = 1
Это self.__class__.count
позволяет мне иметь отдельный счетчик для каждого подкласса. Теперь этот класс, который управляет этими классами, сбрасывается count
для всех подклассов Base
и Base
самого себя при каждой инициализации.
class UseMe: def __init__(self): Base.count = 0 for cls in Base.__subclasses__(): cls.count = 0 self.children: List[Child] = [] # Child is a subclass of Base
Это решает проблему множественных экземпляров UseMe
:
obj = UseMe() obj.children.append(Child()) Child.count # 1 obj2 = UseMe() obj2.children.append(Child()) Child.count # 1
Однако это не то, чего я хочу
obj = UseMe() obj.children.append(Child()) Child.count # 1 obj2 = UseMe() obj.children.append(Child()) Child.count # 1 !!!?
Этот пример упрощен, возможно, я упустил некоторые детали, но проблема актуальна.
Я использую count
, чтобы остановить создание дополнительных классов после определенного предела.
TLDR; Я хочу сохранить count
«глобальный» для экземпляра UseMe
.
Комментарии:
1. Можете ли вы уточнить, что именно вы пытаетесь сделать
count
? Что такое «проблема нескольких экземпляровUseMe
«, которую должна решить перезагрузка? Во втором случае, какого другого результата вы хотите и почему?
Ответ №1:
Конструктор UseMe
сбрасывает все дочерние элементы базового класса на 0:
for cls in Base.__subclasses__(): cls.count = 0
Ведите список Base
, передавая UseMe.count
его Base
:
from typing import List class UseMe: useCount = -1 def __init__(self): UseMe.useCount = 1 self.count = UseMe.useCount # instance counter Base.count.append(0); #Add slot for count of child to the list self.children: List[Child] = [] # Child is a subclass of UseMe class Base: count = [] def __init__(self, um): self.um = um.count # store parent self.__class__.count[um.count] = 1 # add 1 at the parent's UseMe class Child(Base): def __init__(self, um): Base.__init__(self,um) self.count = Base.count[um.useCount] obj = UseMe() obj.children.append(Child(obj)) print(len(obj.children)) #1 print(obj.children[len(obj.children)-1].count) # [1] obj2 = UseMe() obj.children.append(Child(obj)) print(len(obj.children)) # 2 print(obj.children[len(obj.children)-1].count) # [2,0] obj3 = UseMe() obj.children.append(Child(obj)) obj3.children.append(Child(obj3)) print(obj3.children[len(obj3.children)-1].count[obj3.children[len(obj3.children)-1]]) # 1 since Base.count is: [2,0,1]
Дочерний экземпляр может быть назначен нескольким спискам.