相关疑难解决方法(0)

我应该在子类的 __init__ 中重复父类 __init__ 参数,还是使用 **kwargs 代替

想象一下您想要继承的基类:

class Shape:
    def __init__(self, x: float, y: float):
        self.x = x
        self.y = y
Run Code Online (Sandbox Code Playgroud)

在子类的方法中处理父类的 kwargs 似乎有两种常见的模式__init__

您可以完全重述父级的界面:

class Circle(Shape):
    def __init__(self, x: float, y: float, radius: float):
        super().__init__(x=x, y=y)
        self.radius = radius
Run Code Online (Sandbox Code Playgroud)

或者,您可以仅指定特定于子级的接口部分,并将剩余的 kwargs 交给父级__init__

class Circle(Shape):
    def __init__(self, radius: float, **kwargs):
        super().__init__(**kwargs)
        self.radius = radius
Run Code Online (Sandbox Code Playgroud)

这两者似乎都有很大的缺点,所以我很想听听什么是标准或最佳实践。

“重述接口”方法在玩具示例中很有吸引力,就像您在Python 继承的讨论中常见的那样,但是如果我们使用非常复杂的接口(例如pandas.DataFrameor )对某些东西进行子类化怎么办logging.Logger

另外,如果父接口发生变化,我必须记住更改所有子类的接口以匹配、类型提示等。不是很干。

在这些情况下,您几乎肯定会选择该**kwargs选项。

但该**kwargs选项使用户不确定实际需要哪些参数。

在上面的玩具示例中,用户可能天真地写道:

circle = Circle()  # Argument missing for parameter "radius"
Run Code Online (Sandbox Code Playgroud)

他们的 …

python

26
推荐指数
2
解决办法
2845
查看次数

标签 统计

python ×1