Python 中的多态性和类型提示

Polymorphism and Type Hints in Python

考虑以下情况:

class Base:
    ...

class Sub(Base):
    ...

def get_base_instance(*args) -> Base:
    ...

def do_something_with_sub(instance: Sub):
    ...

假设我在我知道它将 return 一个 Sub 实例的上下文中调用 get_base_instance - 可能基于我传递的 args .现在我想将 returned 实例传递给 do_something_with_sub:

sub_instance = get_base_instance(*args)
do_something_with_sub(sub_instance)

问题是我的 IDE 抱怨将 Base 实例传递给只接受 Sub 实例的方法。

我想我记得在其他编程语言中我只是将 returned 实例转换为 Sub。如何解决 Python 中的问题?根据return类型有条件的抛出异常,还是有更好的方法?

您的 IDE(可能是 运行 mypy 或等效的静态类型检查器)抱怨是正确的。就像任何其他 OOP 语言在期望子类的函数被赋予它的超 类 之一时会抱怨一样。 您可以使用以下方式动态检查实际类型:

if isinstance(obj, Sub):
    # do something with Sub
else:
    # do something with Base

我认为你在选角方面的考虑是正确的。我们可以使用 typing 中的 cast 来阻止 IDE 的抱怨。例如:

from typing import cast


class Base:
    pass


class Sub(Base):
    pass


def get_base_instance(*args) -> Base:
    return Sub()


def do_something_with_sub(instance: Sub):
    print(instance)


sub_instance = cast(Sub, get_base_instance())
do_something_with_sub(sub_instance)