<p>直截了当的答案是使用<code>typing.Union</code>和提示反对:</p>
<pre><code>Union[HumanPlayer, IAPlayer]
</code></pre>
<p>但是,这意味着传递的对象可能具有<em>任何</em>类的<em>特征。只要两个类实现同一个接口,这就无关紧要了。但仅仅按照惯例很难使两个类保持同步,所以您应该考虑一种正式的方法,通过使用共享父类来帮助实现这一过程。在这方面<a href="https://docs.python.org/3/library/abc.html" rel="nofollow noreferrer">^{<cd2>}</a>非常有用:</p>
<pre><code>from abc import ABC, abstractmethod
class Player(ABC):
def something_common(self):
# do something common
@abstractmethod
def play(self):
"""Players must implement their specific play style."""
raise NotImplementedError
...
class HumanPlayer(Player):
def play(self):
# play humanely
def care_for_bodily_needs(self):
# take a break
</code></pre>
<p>现在您可以安全地提示<code>Player</code>及其定义良好的接口。如果<code>HumanPlayer</code>或<code>IAPlayer</code>实现了另一个没有实现的东西,那么它将不会包含在<code>Player</code>接口中,因此无法在函数<code>play_game</code>中安全使用,从而使代码类型安全</p>
<pre><code>def play_game(player1: Player, player2: Player):
player1.something_common()
player1.play()
player2.play()
def ensure_is_comfortable(player: HumanPlayer):
player.care_for_bodily_needs() # only safe to call here
</code></pre>