У меня есть абстрактный класс Base
, содержащий логический член do_thing
, который либо запускает одноразовое действие при запуске, либо ничего не делает. Эта переменная может быть переопределена производным классом Derived
, но выполнение вызова super().__init__()
в начале Derived
__init__
приводит к тому, что одноразовое действие всегда основано на установленном do_thing
в Base
.
Я вижу только два варианта решения этой проблемы, ни один из которых не кажется мне идеальным:
Вызывайте super().__init__()
в конце каждого производного класса __init__
, а не в начале, что означает, что я не могу полагаться на другие переменные по умолчанию, установленные в Base
.
Явно вызывайте одноразовое действие в конце каждого производного класса __init__
, что означает либо дублированный код, либо дополнительную функцию в Base
, которая будет вызываться только при запуске.
Пример кода
from abc import ABC
class Base(ABC):
def __init__(self):
self.do_thing = False
# Want to wait for child class init before running this
if self.do_thing:
configuration.set(do_thing_parameters)
class Derived(Base):
def __init__(self):
super().__init__()
# Should have configs properly set based on this being true
self.do_thing = True
class RegularDerived(Base):
def __init__(self):
super().__init__()
# Don't modify the config
Есть ли лучший способ сделать это, что мне не хватает?