基础 class __init__ 中的不同行为取决于派生 class
Different behavior in base class __init__ depending on derived class
我有一个抽象 class Base
包含一个成员布尔值 do_thing
,它将在启动时触发一次性操作,或者什么也不做。这个变量可以被派生的 class Derived
覆盖,但是在 Derived
的 __init__
开始时调用 super().__init__()
会导致一个 -时间操作始终基于 do_thing
在 Base
.
中设置的内容
我只看到两个解决这个问题的选项,对我来说都不理想:
在每个派生的 class 的末尾调用 super().__init__()
而不是开头,这意味着我不能依赖其他默认变量设置在 Base
.
在每个派生的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__
我有一个抽象 class Base
包含一个成员布尔值 do_thing
,它将在启动时触发一次性操作,或者什么也不做。这个变量可以被派生的 class Derived
覆盖,但是在 Derived
的 __init__
开始时调用 super().__init__()
会导致一个 -时间操作始终基于 do_thing
在 Base
.
我只看到两个解决这个问题的选项,对我来说都不理想:
在每个派生的 class 的末尾调用
super().__init__()
而不是开头,这意味着我不能依赖其他默认变量设置在Base
.在每个派生的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__