当我创建一个扩展逻辑的 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)
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)