Количество классов без переменной класса или лучшей альтернативы

#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]  

Дочерний экземпляр может быть назначен нескольким спискам.