You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:52:38