Python typing 如何标注“这个参数是类本身而不是实例”
技术百科
冰川箭仙
发布时间:2026-01-17
浏览: 次 应使用 typing.Type[ClassName](或 Python 3.9+ 的 type[ClassName])标注参数为类本身而非实例,如工厂函数接收 User 类而非 User() 实例,配合 TypeVar 可实现泛型类型关联,避免误用 User(实例)或 type(过于宽泛)。
用 typing.Type[ClassName] 标注,表示参数是类(类型对象),不是其实例。
基础写法:Type[T] 表示“类本身”
当你希望函数接收一个类(比如用于工厂、反射或类型注册),而不是该类的实例时,应使用 typing.Type:
-
Type[Foo]表示“Foo这个类”,即Foo类型的类型对象(如Foo本身,不是Foo()) - 它等价于
type[Foo](Python 3.9+ 推荐写法,更简洁) - 注意:
Foo(未加括号)是类;Foo()是实例 —— 类型标注要和实际传入值一致
实际例子
比如一个创建实例的工厂函数:
from typing import Typeclass User: def init(self, name: str): self.name = name
def create_instance(cls: Type[User], name: str) -> User: return cls(name) # ✅ 正确:cls 是类,可调用
调用时传类,不是实例
u = create_instance(User, "Alice") # ✅
create_instance(User(), "Alice") # ❌ 类型检查器会报错
泛型与动态类:用 TypeVar 更灵活
若函数支持任意类(且返回对应类型的实例),用 TypeVar 保持类型关联:
from typing import Type, TypeVar
T = TypeVar("T", bound=object)
def build(cls: Type[T], *args, *kwargs) -> T: return cls(args, **kwargs)
类型检查器知道:build(Foo, ...) → Foo 实例;build(Bar, ...) → Bar 实例
常见误区
- ❌ 写成
cls: User:这表示参数必须是User的实例,语义完全相反 - ❌ 写成
cls: type:太宽泛,丢失具体类型信息,无法做返回值推导 - ✅ Python 3.9+ 可直接用
type[User]替代Type[User],更直观
# 而不是
# 当你
# python
# 而非
# 更灵活
# 可直接
# 对象
# 泛型
# 报错
# 返回值
# brush
# pre
# 值一致
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 小程序里php怎么变mp4_小程序调用php生成m
- 如何使用Golang sort排序切片_Golan
- Win11怎么设置组合键快捷方式_Windows1
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Windows系统文件被保护机制阻止怎么办_权限不
- MAC怎么使用表情符号面板_MAC Emoji快捷
- 如何在 Go 中正确反序列化 XML 多节点数组(
- 如何使用Golang理解结构体指针方法接收者_Go
- Python爬虫项目实战教程_Scrapy抓取与存
- C++如何获取CPU核心数?(std::threa
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- Win11任务栏怎么固定应用 Win11将软件图标
- Win10 BitLocker加密教程 Win10
- php接口返回数据乱码怎么办_php接口调试编码问
- 如何使用Golang实现容器自动化运维_Golan
- 如何使用Golang捕获并记录协程panic_保证
- 如何解决同一段404代码在不同主机上表现不一致的问
- Win11怎么查看局域网电脑_Windows 11
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- Windows怎样关闭锁屏广告_Windows关闭
- PHP接收参数值为空怎么办_判断和处理空参数方法说
- C++如何使用std::optional?(处理可
- Win11怎么开启智能存储_Windows11存储
- Win11怎么关闭定位服务 Win11禁止应用获取
- Python函数参数高级用法_默认值与可变参数解析
- Win11怎么设置指纹解锁 Win11笔记本录入指
- Python配置文件操作教程_JSONINIYAM
- mac本地php环境如何开启curl_curl扩展
- Win11怎么设置默认邮件应用_Windows11
- 如何使用Golang实现聊天室消息存档_存储聊天记
- Win11怎么设置环境变量_Win11配置Path
- Win11麦克风没声音怎么设置_Win11麦克风权
- Win10路由器怎么隐藏ssid Win10隐藏w
- php文件怎么变mp4保存_php输出视频流保存为
- c++协程和线程的区别 c++异步编程模型对比【核
- Win11怎么设置麦克风权限_允许应用访问Win1
- Windows7怎么找回经典开始菜单_Window
- Python项目维护经验_长期演进说明【指导】
- Windows10如何查看保存的WiFi密码_Wi
- 如何在Golang中实现微服务负载均衡_Golan
- Win11怎么更改系统语言_Win11中文语言包下
- php订单日志怎么在swoole写_php协程sw
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- c++中如何使用auto关键字_c++11类型推导
- 如何在 Go 中正确反序列化多个同级 XML 元素
- Win11怎么设置开机问候语_自定义Win11锁屏
- Mac的Time Machine怎么用_Mac系统
- Win11时间格式怎么改成12小时制 Win11时
- php485返回空数组怎么回事_php485数据接
- Win11怎么关闭系统推荐内容_Windows11


QQ客服