Python 使用 child class 的 class 属性作为默认参数而不覆盖方法
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 属性时,它不会将其用作默认参数。
class SomeChildClass(SomeClass):
"""Some child class."""
DEFAULT_VAL = 1
some_child_class = SomeChildClass()
打印:default = 1 and some_param = 0.
有什么方法可以让我完成这项工作,而无需在 child class?[=31= 中显式覆盖 __init__
]
研究
问题非常相似,但它们覆盖了 __init__
。
Reinitialize parent class attributes during child class definition
提供了一个可能的解决方案,使用 metaclass
通过 __new__
指定 DEFAULT_VAL
。此解决方案使 SomeClass
变得冗长,这还不错。我想知道它是否可以做得更简单。
Overriding class variables in python
在 this answer 中,它告诉我问题是在定义函数 __init__
时计算 DEFAULT_VAL
。但是,我不太确定使用 classmethod
是否适用于我的用例。
这里的问题是默认值采用对象,而不是variables/attributes。定义函数时,对象被计算一次。在任何函数中解决这个的通用方法是做类似的事情:
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}.")
初始化 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 属性时,它不会将其用作默认参数。
class SomeChildClass(SomeClass):
"""Some child class."""
DEFAULT_VAL = 1
some_child_class = SomeChildClass()
打印:default = 1 and some_param = 0.
有什么方法可以让我完成这项工作,而无需在 child class?[=31= 中显式覆盖 __init__
]
研究
问题非常相似,但它们覆盖了 __init__
。
Reinitialize parent class attributes during child class definition
提供了一个可能的解决方案,使用 metaclass
通过 __new__
指定 DEFAULT_VAL
。此解决方案使 SomeClass
变得冗长,这还不错。我想知道它是否可以做得更简单。
Overriding class variables in python
在 this answer 中,它告诉我问题是在定义函数 __init__
时计算 DEFAULT_VAL
。但是,我不太确定使用 classmethod
是否适用于我的用例。
这里的问题是默认值采用对象,而不是variables/attributes。定义函数时,对象被计算一次。在任何函数中解决这个的通用方法是做类似的事情:
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}.")