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}.")