假设我有一个带有单个函数的接口A
。
class A(metaclass=ABCMeta):
@abstractmethod
def spam(self, x: int) -> str:
pass
实现此接口的类B
和C
,但不会直接初始化它们。我将有一些工厂方法(比如说)将返回给我一个实现A
的合适对象。所以在这种情况下,当我在spam
和B
中实现C
时,我应该重复类型提示吗?实际上,由于未直接使用B
和C
,因此A
的类型提示似乎已足够。但我很好奇这种情况下的最佳做法;如果还有其他问题需要考虑。
答案 0 :(得分:0)
据推测,既然你实现了B.spam
,那么它将不是一个简单的实现(否则,为什么还要覆盖A.spam
?)。所以你可能应该检查B.spam
的正文。在这种情况下,您需要为参数提供类型提示并返回B.spam
的值;否则,mypy会将这些类型视为Any
。
请注意,如果您确实提供了类型提示,mypy会检查B.spam
的类型是否与使用rules for subclassing的A.spam
兼容,但仅 B
来自A
非虚拟;如果你只是A.register(B)
,mypy将完全忽略继承关系。这与运行时在虚拟基类中不会查找.spam
的方式一致。