Python中如何显式声明函数参数为自定义类数组及子类兼容?
Python自定义类数组的类型注解方法
首先明确:Python里直接用[foobar]这种写法是旧版的非正式语法,现在有标准的方式来标注自定义类的列表参数,同时也支持抽象基类的子类兼容场景。
1. 标注自定义类的列表参数
兼容Python 3.5-3.8:用typing.List
需要先从typing模块导入List类型:
from typing import List class Foobar: def __init__(self): pass def foo_bar(foo: str, bar: int, array_of_foobar: List[Foobar]): print("foo bar stuff")
Python 3.9+:直接用内置list
3.9及以后的Python版本支持直接用list[Foobar]这种写法,无需额外导入:
class Foobar: def __init__(self): pass def foo_bar(foo: str, bar: int, array_of_foobar: list[Foobar]): print("foo bar stuff")
2. 抽象基类的子类兼容场景
如果Foobar是抽象基类(ABC),它的子类实例也会被类型检查工具认可为合法的列表元素——因为子类是父类的子类型,符合类型注解的要求。
举个实际例子:
from abc import ABC, abstractmethod from typing import List class Foobar(ABC): @abstractmethod def do_something(self): pass class FoobarChild(Foobar): def do_something(self): print("执行子类逻辑") def foo_bar(array_of_foobar: List[Foobar]): for item in array_of_foobar: item.do_something() # 传入FoobarChild的列表完全合法 foo_bar([FoobarChild(), FoobarChild()])
关键注意点
- Python是动态类型语言,类型注解只是开发阶段的提示,不会在运行时自动强制检查。如果需要运行时验证,得自己在函数里加逻辑:
def foo_bar(array_of_foobar: list[Foobar]): for item in array_of_foobar: if not isinstance(item, Foobar): raise TypeError("数组元素必须是Foobar类型或其子类") # 后续业务逻辑
- 用mypy、pyright这类静态类型检查工具,可以在开发阶段提前发现类型不匹配的问题。
内容的提问来源于stack exchange,提问作者user21113865
相关产品推荐
相关产品推荐

