Python中的类对象示例详解
前言类对象这个说法经常被误用。有人用它泛指类的实例有人用它指类本身。本文取后者类本身也是一个对象。这一句不是修辞——你可以把类赋值给变量、放进字典、当参数传、当返回值返回就像操作任何普通对象一样。另一个常见误解是类只能靠class语法创建。实际上class语句只是调用元类type的语法糖你也可以直接用type()动态造类。本文用一系列示例展示类作为对象的方方面面类的元数据、动态创建、类作为一等公民传递、可调用对象以及子类钩子。一、类对象的元数据每个类都带有一组属性描述它自己叫什么、属于哪个模块、继承自谁。# 适用于 Python 3.8class Animal:passclass Dog(Animal):一只狗。print(Dog.__name__) # Dogprint(Dog.__qualname__) # Dogprint(Dog.__module__) # __main__print(Dog.__doc__) # 一只狗。print(Dog.__bases__) # (class __main__.Animal,)print(type(Dog)) # class typeprint(isinstance(Dog, type)) # True属性含义__name__类名短名__qualname__限定名含外层路径__module__定义所在的模块名__bases__直接基类元组__mro__方法解析顺序元组__dict__类的命名空间type(cls)元类默认是type因为type(Dog)是type所以类也是某个类的实例——它的实例所属类型就是元类。二、用type()动态创建类type有两个用法单参数调用返回对象类型三参数调用创建新类。三参数形式是type(类名, 基类元组, 命名空间字典)。# 适用于 Python 3.8def greet(self):return f你好{self.name}def make(self, name):self.name namePerson type(Person, (object,), {__init__: make,greet: greet,species: 人,})p Person(Ada)print(p.greet()) # 你好Adaprint(Person.__name__) # Personprint(p.species) # 人这说明了class语句的本质它执行类体收集出一个命名空间字典然后交给元类构造类对象。理解这点后面学元类就顺了。三、类是一等公民类可以像普通值一样被传递和存储这让注册表和工厂模式变得非常自然。# 适用于 Python 3.8class JsonParser:name jsondef parse(self, text):return f解析 json: {text}class CsvParser:name csvdef parse(self, text):return f解析 csv: {text}registry {cls.name: cls for cls in (JsonParser, CsvParser)}def build(fmt):cls registry.get(fmt)if cls is None:raise ValueError(f不支持的格式: {fmt})return cls() # 类对象可直接调用print(build(csv).parse(a,b)) # 解析 csv: a,b这里registry里的值就是类对象本身cls()通过调用类来创建实例。# 适用于 Python 3.8def describe(cls):return f{cls.__name__} 继承自 {[b.__name__ for b in cls.__bases__]}print(describe(JsonParser)) # JsonParser 继承自 [object]四、类也可被调用实例也可以调用类会创建实例由元类的__call__完成而如果一个类定义了__call__它的实例也能像函数一样被调用。# 适用于 Python 3.8class Multiplier:def __init__(self, factor):self.factor factordef __call__(self, x):return x * self.factordouble Multiplier(2)print(double(10)) # 20print(callable(double)) # Trueprint(callable(Multiplier)) # True判断能不能调用用内置的callable()它同时适用于类、函数、定义了__call__的实例。五、子类钩子__init_subclass____init_subclass__Python 3.6 引入是定义在父类里的类方法每当有子类被创建时自动调用常用来做注册或校验。# 适用于 Python 3.8class Plugin:registry {}def __init_subclass__(cls, **kwargs):super().__init_subclass__(**kwargs)Plugin.registry[cls.__name__] clsclass AuthPlugin(Plugin):passclass CachePlugin(Plugin):passprint(sorted(Plugin.registry)) # [AuthPlugin, CachePlugin]注意__init_subclass__是隐式类方法第一个参数是新建的子类cls不需要classmethod装饰器。六、一个综合示例# 适用于 Python 3.8class Model:table Nonedef __init_subclass__(cls, **kwargs):super().__init_subclass__(**kwargs)if cls.table is None:cls.table cls.__name__.lower()def __repr__(self):return f{type(self).__name__}(**{vars(self)!r})class User(Model):def __init__(self, user_id, name):self.user_id user_idself.name nameclass Post(Model):table postsdef __init__(self, title):self.title titleprint(User.table) # user由钩子自动补print(Post.table) # posts子类自己指定print(User(1, Ada)) # User(**{user_id: 1, name: Ada})常见坑点把类对象和类的实例混为一谈❌python # 适用于 Python 3.8 def use(obj): print(obj.__name__) # 传实例进来会 AttributeError✅python # 适用于 Python 3.8 def use(obj): if isinstance(obj, type): return obj.__name__ return type(obj).__name__type(x) SomeClass无法匹配子类❌python # 适用于 Python 3.8 print(type(Dog()) Animal) # False✅python # 适用于 Python 3.8 print(isinstance(Dog(), Animal)) # True用type()动态建类时忘了传基类元组❌python # 适用于 Python 3.8 type(A, object, {}) # TypeError第二参必须是元组✅python # 适用于 Python 3.8 type(A, (object,), {})在__init_subclass__里写实例参数❌python # 适用于 Python 3.8 def __init_subclass__(self): # 名字错参数其实是子类 ...✅python # 适用于 Python 3.8 def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs)以为callable(cls)是False❌python # 适用于 Python 3.8 assert not callable(Animal) # AssertionError类其实可调用✅python # 适用于 Python 3.8 print(callable(Animal)) # True动态造类时字典里写了实例方法却忘了 self❌python # 适用于 Python 3.8 def greet(): # 缺 self return hiC type(C, (object,), {greet: greet}) C().greet() # TypeError ✅python # 适用于 Python 3.8 def greet(self): return hiC type(C, (object,), {greet: greet}) print(C().greet()) # hi 在子类里访问父类__init_subclass__未处理的参数❌python # 适用于 Python 3.8 class Base: def __init_subclass__(cls): pass # 不转发 kwargs带类参数的子类定义会失败✅python # 适用于 Python 3.8 class Base: def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs)总结观点说明类是对象实例类型是元类默认type类可动态创建type(name, bases, ns)类是一等公民可赋值、可传参、可入容器类可调用Cls()创建实例实例可调用定义了__call__即可子类钩子__init_subclass__在子类创建时触发类也是一个对象不是抽象口号它直接解释了工厂模式、注册表和元类为什么能这么写。把类当普通值来用把type三参数形式当class语句的底层形式来理解很多高级用法都会变得顺理成章。

相关新闻

中文法律大模型落地实战:知识注入、RAG校验与逻辑安全

中文法律大模型落地实战:知识注入、RAG校验与逻辑安全

简介:本资源是一套面向AI开发者与法律科技从业者的中文法律领域大语言模型应用实践方案,聚焦大模型在司法文书理解、法律问答与知识推理等场景的落地实现。压缩包共42个文件,含12个核心Python脚本(如finetune.py、infer.py、webui…

2026/10/9 12:30:52 阅读更多 →
中文法律大模型落地实战:结构化注入、可控推理与可溯源验证

中文法律大模型落地实战:结构化注入、可控推理与可溯源验证

简介:本资源是面向AI开发者与法律科技从业者的中文法律领域大语言模型应用实践包,聚焦大模型在司法文书理解、法律问答、案情推理等垂直场景的落地实现。压缩包共42个文件,含12个核心Python脚本(如finetune.py、infer.py、webui.p…

2026/10/9 12:30:51 阅读更多 →
kernelbase.dll丢失怎么办?系统文件修复与DLL恢复全指南

kernelbase.dll丢失怎么办?系统文件修复与DLL恢复全指南

我在帮朋友处理电脑故障时,最常被问到的一类问题就是“程序突然打不开,提示缺少 kernelbase.dll”。别慌,这个文件不是“绝症”,绝大多数情况都能在半小时内搞定,只是很多人不知道正确的排查顺序,一上来就百…

2026/10/9 12:30:51 阅读更多 →

最新新闻

CTF杂项信息隐藏实战:从PNG元数据到LSB隐写的完整链路

CTF杂项信息隐藏实战:从PNG元数据到LSB隐写的完整链路

昨天把SWPUCTF 2024 秋季新生赛的题目重新过了一遍,最想写复盘的是 [SWPUCTF 2024 秋季新生赛]hidden 。题名只有六个字母,却几乎浓缩了新生赛杂项题最典型的考法:信息隐藏。文件末尾塞压缩包、EXIF里写密码、像素最低位藏flag——这些在“…

2026/10/9 17:24:24 阅读更多 →
不止是提示词:用 Skills 与 SKILL.md 让 ChatGPT 重复任务可靠又省力

不止是提示词:用 Skills 与 SKILL.md 让 ChatGPT 重复任务可靠又省力

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 17:24:24 阅读更多 →
Claude.md的4个提效规则:用TaoToken统一Key打通AI辅助编程工作流

Claude.md的4个提效规则:用TaoToken统一Key打通AI辅助编程工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 17:24:24 阅读更多 →
Oracle EBS模块流程图绘制指南:从业务调研到Word排版

Oracle EBS模块流程图绘制指南:从业务调研到Word排版

简介:Oracle EBS 模块流程图是一份面向 ERP 实施顾问、财务与供应链从业者及系统学习者的模块全景图文档。内容以 Oracle E-Business Suite 为核心,系统梳理了总帐管理(GL)、应付/应收、固定资产、现金管理、库存、采购、销售订单…

2026/10/9 17:24:24 阅读更多 →
NX二次开发中UF_CURVE_ask_isocline函数怎么用?TaoToken统一Key通道调试UFUN等距曲线提取

NX二次开发中UF_CURVE_ask_isocline函数怎么用?TaoToken统一Key通道调试UFUN等距曲线提取

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 17:24:24 阅读更多 →
PHP整站程序拆包实战:在线名片制作系统源码还原与二次开发

PHP整站程序拆包实战:在线名片制作系统源码还原与二次开发

简介:这是一套面向中小商家、设计工作室及个人创业者的在线名片制作整站程序,基于PHP开发,适合具备基础建站能力、希望快速搭建名片定制与下单平台的开发者使用。系统集在线制作、在线提交、在线下单与在线上传于一体,内置3000多套…

2026/10/9 17:23:21 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →