[英]Python using child class's class attribute as default parameter without overriding method
在初始化 class 时,参数的默认 arg 是常量 class 属性。
class SomeClass:
"""Some class."""
DEFAULT_VAL = 0
def __init__(self, some_param: int = DEFAULT_VAL):
print(f"default = {self.DEFAULT_VAL} and some_param = {some_param}.")
some_class = SomeClass()
打印: default = 0 and some_param = 0.
当我将 class 子类化并覆盖常量 class 属性时,它不会将其用作默认参数。
class SomeChildClass(SomeClass):
"""Some child class."""
DEFAULT_VAL = 1
some_child_class = SomeChildClass()
打印: default = 1 and some_param = 0.
有什么方法可以让我完成这项工作,而无需在子 class 中显式覆盖__init__
?
研究
如何使用子 class 的默认值调用父 class init?
问题非常相似,但它们覆盖了__init__
。
提供一个可能的解决方案,使用metaclass
通过__new__
指定DEFAULT_VAL
。 这个解决方案增加了SomeClass
的冗长,这还不错。 我想知道它是否可以做得更简单。
在这个答案中,它告诉我问题是在定义 function __init__
时评估DEFAULT_VAL
。 但是,我不太确定使用classmethod
是否适用于我的用例。
这里的问题是默认值采用对象,而不是变量/属性。 object 在定义 function 时评估一次。 在任何 function中解决此问题的通用方法是执行以下操作:
class SomeClass:
"""Some class."""
DEFAULT_VAL = 0
def __init__(self, some_param: int = None):
if some_param is None:
some_param = self.DEFAULT_VAL
print(f"default = {self.DEFAULT_VAL} and some_param = {some_param}.")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.