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)
考虑以下情况:
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)