Python — переопределяющий унаследованный метод одноэлементного класса

#python #inheritance #singleton

Вопрос:

Я пытался переопределить метод, унаследованный от одноэлементного класса, но он не был переопределен, как я ожидал. пожалуйста, помогите мне исправить то, что я здесь пропустил!

 class SuperParent():  _instance = None   class SingletonParent(SuperParent):  @staticmethod  def get_instance():  if SingletonParent._instance is None:  SingletonParent()  return SingletonParent._instance   def __init__(self):  if SingletonParent._instance is not None:  raise RuntimeError('Use get_instance()')  SingletonParent._instance = self   def print_hi(self):  print("Hi from SingletonParent")   class SingletonChild(SingletonParent):  def print_hi(self):  print("Hi from SingletonChild")  

Когда я инициализирую SingletonChild и вызываю метод «print_hi», он печатается из SingletonParent, а не из переопределенного метода в SingletonChild.

 singleton_child = SingletonChild.get_instance() singleton_child.print_hi()  

Привет от СинглтонпАрента

Комментарии:

1. get_instance можно только создать экземпляр SingletonParent , нет SingletonChild . Вам действительно нужен только один экземпляр во всех классах, или вы хотите разрешить один экземпляр SingletonParent и один экземпляр SingletonChild и т. Д.?

2. Я бы рекомендовал создать get_instance метод класса (чтобы он мог создавать экземпляр любого класса, вызывающего его), но тогда вы все равно будете ограничены созданием экземпляра того класса, который использует его первым, а не по одному экземпляру на класс. Неясно, что SuperParent отслеживание одного экземпляра-это то, что вам нужно. Вероятно, каждый класс должен иметь свой собственный _instance атрибут (который get_instance можно создавать по мере необходимости).

3. Кроме того, если __init__ вызывается, вы уже создали второй экземпляр класса. Переопределите __new__ вместо этого, чтобы в первую очередь предотвратить создание ненужного экземпляра.