繁体   English   中英

Python 使用子类的 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 SomeChildClass(SomeClass):
    """Some child class."""

    DEFAULT_VAL = 1


some_child_class = SomeChildClass()

打印: default = 1 and some_param = 0.

有什么方法可以让我完成这项工作,而无需在子 class 中显式覆盖__init__


研究

如何使用子 class 的默认值调用父 class init?

问题非常相似,但它们覆盖了__init__

在子 class 定义期间重新初始化父 class 属性

提供一个可能的解决方案,使用metaclass通过__new__指定DEFAULT_VAL 这个解决方案增加了SomeClass的冗长,这还不错。 我想知道它是否可以做得更简单。

覆盖 python 中的 class 变量

这个答案中,它告诉我问题是在定义 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM