对于简单的继承,例如
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的方式是什么?
使一个类变量。
class Base:
DEFAULT_ENV = "prod"
def __init__(self, env=None):
if env is None:
env = self.DEFAULT_ENV
# ...
如果要在子类中使用其他默认环境,只需DEFAULT_ENV
在该类中重写即可。如果要更改默认的env对于不重写所有的类,改变DEFAULT_ENV
的Base
意愿工作。
另外__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] 删除。
我来说两句