gpt4 book ai didi

python - 如何避免使用 Python 继承重新定义默认参数

转载 作者:太空宇宙 更新时间:2023-11-04 01:53:28 27 4
gpt4 key购买 nike

对于简单的继承如

class Base:
def __init__(self, env: str = 'prod'):
#...

class Derived(Base):
def __init__(self, env: str = 'prod'):
super().__init__(str)

如何避免在两个类中重新定义默认构造函数参数?如果我实例化 Derived() 我确实希望 env 默认为 'prod',我只是不想重新定义多个值类。如果我后来决定默认值应该是其他值(例如 'dev'),那么我将不得不更改所有派生的构造函数。

我在想类似的事情

class Base:
def __init__(self, env: str = 'prod'):
#...

class Derived(Base):
def __init__(self, env: str = None):
if env is None:
super().__init__()
else:
super().__init__(env)

或者在基类中将默认值定义为全局常量?这两种方法似乎都过于复杂。什么是 Pythonic 方式?

最佳答案

创建一个类变量。

class Base:
DEFAULT_ENV = "prod"
def __init__(self, env=None):
if env is None:
env = self.DEFAULT_ENV
# ...

如果您想在子类中使用不同的默认环境,只需覆盖该类中的 DEFAULT_ENV 即可。如果您想为所有未覆盖它的类更改默认环境,则可以更改 Base 中的 DEFAULT_ENV

此外,在 Python 中重新定义子类中的 __init__ 是可选的,因此如果您不希望子类中的 __init__ 实现与 Base 不同的行为> 只是在子类中省略它。在类变量中使用默认环境的另一个优点是,如果您只想在子类中更改它,您可以覆盖类变量,而不必在子类中重新定义 __init__!

编辑:如果您觉得 env 确定稍后可能需要一些有趣的业务(例如测试环境变量或应用程序中的其他任何内容),您可能希望将 default_env 包装在一个属性中:

class Base:
DEFAULT_ENV = "prod"
def __init__(self, env=None):
if env is None:
env = self.default_env
# ...
@property
def default_env(self):
return self.DEFAULT_ENV

以后您可以通过这种方式在属性 getter 中实现预期的行为。

关于python - 如何避免使用 Python 继承重新定义默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57477759/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com