【发布时间】:2021-12-02 05:32:37
【问题描述】:
我有一个独立的函数,它使用super(),并像这样使用它:
import typing
from abc import ABC
class Foo(typing.Protocol):
def foo(): raise NotImplementedError
def free_foo(child):
super(child.__class__, child).foo()
class Base(ABC):
pass
class Parent1(Base):
def foo(self): pass
class Child1(Parent1):
foo = free_foo
class Parent2(Base):
def foo(self): pass
class Child2(Parent2):
foo = free_foo
如何注释free_foo 函数?我需要指出child 既是Base 的实例又符合Foo 协议?
【问题讨论】:
-
请注意,
super(child.__class__, child)本质上是损坏的。它将通过跳过child的实际类在 MRO 中搜索,从 second 条目开始,无论这是哪个条目。相反,它应该跳过foo所在的类。现在如果你定义另一个class GrandChild(Child2): def foo(self): return super().foo(),中间的free_foo会无限递归地调用自己。 -
这是真的,但我真的找不到解决这个问题的方法。
标签: python type-hinting mypy python-typing