混入中的 super().__init__(....) 失败,因为“对象”的“__init__”参数太多`

kur*_*tgn 5 python mypy

当我创建一个扩展逻辑的 mixin 类时__init__,通常要做的是:

class ExtraValuemixin:

    def __init__(self, *args, **kwargs)  -> None:
        super().__init__(*args, **kwargs)
        # some extra initialization
        self._extra_value = 1

    def retrieve_extra_value(self):
        return self._extra_value
Run Code Online (Sandbox Code Playgroud)

然而,这对 mypy 来说似乎是错误的,正如它所说:

Too many arguments for "__init__" of "object"
Run Code Online (Sandbox Code Playgroud)

我明白了,在的构造函数签名中没有*argsor ;但这是一个 mixin,它依赖于它的孩子的构造函数。我如何让 mypy 理解这一点?**kwargsobject

完整示例:

class ExtraValuemixin:

    def __init__(self, *args, **kwargs)  -> None:
        super().__init__(*args, **kwargs)
        # some extra initialization
        self._extra_value = 1

    def retrieve_extra_value(self):
        return self._extra_value


class ParentObj:

    def __init__(self, value):
        self.value = value


class ChildObj(ExtraValuemixin, ParentObj):
    pass


obj = ChildObj(value=5)

print(obj.retrieve_extra_value())
Run Code Online (Sandbox Code Playgroud)

rna*_*ath 1

super().__init__(...)
Run Code Online (Sandbox Code Playgroud)

调用__init__其父类的函数。


定义一个类

class XXX:
Run Code Online (Sandbox Code Playgroud)

(省略层次结构父级),将父级保留为默认值:我们的朋友和心爱的object班级。

我们知道该类的来源如下:

class object:
    def __init__():
Run Code Online (Sandbox Code Playgroud)

这意味着它不接受任何参数。您本质上是__init__用两个参数来调用它的。因此,您的确切错误是:

Too many arguments for "__init__" of "object"
Run Code Online (Sandbox Code Playgroud)