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

乐宝

对于简单的继承,例如

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)

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

瓦伦丁B.

使一个类变量。

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

如果要在子类中使用其他默认环境,只需DEFAULT_ENV在该类中重写即可如果要更改默认的env对于不重写所有的类,改变DEFAULT_ENVBase意愿工作。

另外__init__,在子类中重新定义是Python中的可选操作,因此,如果您不想__init__在子类中实现与Base仅在子类中忽略它不同的行为将默认环境包含在类变量中的另一个优点是,如果只想更改子类中的变量,则可以覆盖类变量,而不必__init__在子级中重新定义!

编辑:如果您以后确定环境确定可能需要一些有趣的事情(例如测试环境变量或应用程序中的其他任何事情),则可能需要包装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中实现预期的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章