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

时间:2019-04-29 19:02:55

标签: python python-3.x abstract-class derived-class

我有一个抽象类Base,其中包含成员boolean do_thing,该成员将在启动时触发一次性动作,或者不执行任何操作。派生类Derived可以覆盖此变量,但是在super().__init__()的{​​{1}}开头进行Derived调用会导致一次性操作始终基于__init__中设置的do_thing

我只看到两种解决方案,对我来说都不是理想选择:

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

  2. 在每个派生类的Base的末尾显式调用一次性操作,这意味着重复的代码或__init__中的一个附加函数只能在启动时调用

一些示例代码

Base

我是否有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

从您的描述看来,您的do_thing功能与您的类有关,而与您的实例有关。如果是这样,将其作为__init__的参数似乎并不正确。您还有其他选择,我会同意的

类属性

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

然后,您甚至不需要在子类中定义__init__

答案 1 :(得分:0)

尝试将“ 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)