17370845950

typing 如何标注“这个参数是类对象而不是类实例”
应使用 type[T](Python 3.9+)或 typing.Type[T](旧版本),表示参数为类对象本身而非其实例,如 type[str] 指 str 类,非字符串实例。

在 Python 类型标注中,要表达“这个参数是类对象(即类型本身)而不是类的实例”,应使用 type[ClassName]

type[T] 标注类对象

Python 3.9+ 原生支持 type[T] 语法,表示“T 类型的类对象”(即 T__class__,如 strint、自定义类名等)。

  • type[str] 表示 str 这个类(不是字符串实例),合法值如 strbytes(若协变允许)、或继承自 str 的类(取决于上下文)
  • type[MyClass] 表示 MyClass 类本身,不是 MyClass()
  • 若需接受任意类,可用

    type[Any]
    (需从 typing 导入 Any

兼容旧版本(Py3.8 及以下)

在 Python 3.8 或需支持 typing_extensions 的场景中,改用 typing.Type[T]

  • from typing import Type
  • def func(cls: Type[MyClass]) -> MyClass: 表示参数 clsMyClass 类(或其子类)
  • Type 在 Py3.9+ 中仍可用,但官方推荐迁移到 type[T]

常见误标与对比

注意区分以下三种写法:

  • MyClass → 表示 MyClass 的一个实例(最常用)
  • type[MyClass]Type[MyClass] → 表示 MyClass 这个类对象本身
  • Callable[..., MyClass] → 表示一个返回 MyClass 实例的可调用对象,不等于类本身

实际例子

比如写一个工厂函数,接收类并返回其实例:

from typing import type  # Py3.9+

def create_instance(cls: type[str]) -> str: return cls("hello") # ✅ 合法:str("hello")

调用时传的是类,不是实例

s = create_instance(str) # ✅

create_instance("abc") # ❌ 类型检查报错