#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__
вместо этого, чтобы в первую очередь предотвратить создание ненужного экземпляра.