MyPy 抱怨
error: "object" has no attribute "my_function" [attr-defined]
当我遍历类列表并为每个类执行一个函数时:
list_of_classes = [ClassA(), ClassB(), ...]
for current_class in list_of_classes:
result = current_class.my_function(arguments)
代码运行良好,只是mypy有问题。我需要以特殊方式声明类吗?
提前致谢!
没有类型提示,
mypy
推断出 list_of_classes
的类型为 list[object]
,因为 object
似乎是 ClassA
等人最具体的基类。有共同点。如果只知道 current_class
是 object
的一个实例,则不能假设它具有 my_function
属性。
有两种选择:
使用名义子类型。在名义子类型下,如果
A
是 B
的子类,则 A
是 B
的子类型。
定义一个定义
my_function
的基类,并有ClassA
等。从那个基类继承。然后类型推断应该选择该基类作为所有类继承自的最具体的类。 (如果没有,您可以使用显式类型提示 list_of_classes: list[Base] = ...
(其中 Base
是您定义的基类)。
使用结构子类型。在结构子类型下,如果
A
具有(至少)与 B
相同的属性,则 A
是 B
的子类型。
为具有
my_function
的类定义协议,并为list_of_classes
提供显式类型提示。
class HasMyFunction(typing.Protocol):
def my_function(self, x):
...
...
list_of_classes: list[HasMyFunction] = [ClassA(), ClassB()]
任何提供
my_function
属性的类型都将被视为HasMyFunction
的子类型。