<p>如果我将<code>Node</code>作为基类,那么似乎没有一种方法可以使用Python的类型暗示来获得我想要的结果。但是,我可以通过将<code>Node</code>更改为mixin使其工作</p>
<pre><code>from typing import TypeVar, Iterable, Generic
T = TypeVar("T")
class NodeMixin(Generic[T]):
def __init__(self, *children: T):
self.children = children
def depth_first_search(self) -> Iterable[T]:
yield self
for child in self.children:
yield from child.depth_first_search()
class StringNode(NodeMixin["StringNode"]):
def __init__(self, content: str, *children: T):
super().__init__(*children)
self.content = content
def upper(self) -> str:
return self.content.upper()
class IntegerNode(NodeMixin["IntegerNode"]):
def __init__(self, content: int, *children: T):
super().__init__(*children)
self.content = content
def add_five(self) -> int:
return self.content + 5
if __name__ == "__main__":
t = StringNode("apple", StringNode("banana"), StringNode("pear"))
for n in t.depth_first_search():
print(n.upper())
t = IntegerNode(1, IntegerNode(2), IntegerNode(3))
for n in t.depth_first_search():
print(n.add_five())
</code></pre>
<p>这运行正确,PyCharm没有给我任何警告。此外,如果我错误地尝试调用<code>upper</code>或<code>add_five</code>由<code>NodeMixin.depth_first_search</code>返回的错误类型的对象,我会收到警告</p>