基础 class __init__ 中的不同行为取决于派生 class

Different behavior in base class __init__ depending on derived class

我有一个抽象 class Base 包含一个成员布尔值 do_thing ,它将在启动时触发一次性操作,或者什么也不做。这个变量可以被派生的 class Derived 覆盖,但是在 Derived__init__ 开始时调用 super().__init__() 会导致一个 -时间操作始终基于 do_thingBase.

中设置的内容

我只看到两个解决这个问题的选项,对我来说都不理想:

  1. 在每个派生的 class 的末尾调用 super().__init__() 而不是开头,这意味着我不能依赖其他默认变量设置在 Base.

  2. 在每个派生的class的__init__末尾显式调用一次性动作,这意味着重复代码,或者[=14中的额外函数=] 只会在启动时调用。

一些示例代码

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

是否有我缺少的更好的方法?

尝试将 "do_thing" 变量设置为默认参数,如下所示...

from abc import ABC

class Base(ABC):
    def __init__(self, do_thing=False):
        if do_thing:
            configuration.set(do_thing_parameters) 


class Derived(Base):
    def __init__(self):
        super().__init__(True)

根据您的描述,听起来您的 do_thing 功能与您的 classes 有关,而不是与您的实例有关。如果是这样,将它作为 __init__ 的参数似乎不对。你还有其他选择,我会选择

一个class属性

class Base:
    _do_thing = False

    def __init__(self):
        if self._do_thing:
            configuration.set(do_thing_parameters)

class Derived(Base):
    _do_thing = True

class RegularDerived(Base):
    pass

那么你甚至不需要在subclasses

中定义__init__