Python面向对象编程实战:封装、继承与多态三大特性详解

”我最近在复盘一个接手过来的老项目,代码确实能跑,但改起来真的要命。各种全局变量满天飞,同一段逻辑散落在七八个文件里,加了新需求就要把相关函数一个个翻出来改。我当时心里就想,如果当初写代码的人真的理解了Python面向对象编程,把封装、继承、多态这三大特性用到位,后续维护成本至少能降一半。带着这口气,我后来在好几个从零起步的项目里刻意落实了这三大特性,踩过不少坑,也总结出一些很实在的用法。这篇就把我实际用的思路和代码沉淀下来,给同样被烂代码折磨过的朋友一个参考。


1. 三大特性到底在解决什么问题

1.1 先说现状:很多人把面向对象写成了“面向函数”

我见过不少Python开发者的代码,名义上是类是对象,实际上就是拿类当个容器,把几个函数往里一塞,方法之间没有数据关联,类与类之间也没有边界。这种写法不是面向对象,顶多算是“带类的面向过程”。三大特性的存在意义不是让你“炫”语法,而是强制你在编码时思考职责边界、复用层次和扩展方式。

真正用好三大特性的代码,会有三个明显表现:第一,类的内部状态不会被外部随便改动,数据安全性高;第二,公共逻辑抽取到父类,子类只写差异部分,代码量显著下降;第三个,调用方只面向抽象编程,新增功能时不用大改原有调用链。这三点分别对应封装、继承和多态,缺一个,代码都会慢慢腐烂。

1.2 为什么偏偏是这三个特性

封装、继承、多态不是并列的三个语法糖,它们其实是一条完整的建模链路。封装解决的是“一个对象应该暴露什么、隐藏什么”;继承解决的是“多个类之间的共性怎么沉淀”;多态解决的是“不同的对象怎么用统一的方式去协作”。

打个比方,就像开一家餐厅。封装是厨房和后厨的管理规则——客人只需要看菜单点菜,不需要知道后厨怎么洗菜切菜;继承是菜品之间共享的底料配方——番茄锅和麻辣锅都是用同一个高汤底,只是加了不同调料;多态是服务员对“上菜”这件事的统一理解——不管是热菜、凉菜还是甜品,服务员只需要把盘子端到对应桌上就行。三者配合,餐厅才能稳定运转。


2. 封装:把内部细节关进小黑屋

2.1 封装的本质是“信任边界”

封装的核心不是“不让别人访问”,而是“明确定义什么可以访问”。在Python里,所有成员变量和方法本质上都是可访问的,这跟Java、C++那种强私有不同。Python靠的是约定和机制,而不是强制。

我曾经维护过一个数据上报模块,最初版本里所有字段都是直接暴露的。后来别的同事在业务代码里随手改了上报状态字段,结果数据校验逻辑没走到,线上出现了一批脏数据。排查了很久才发现是状态字段被外部直接篡改。从那以后我就坚持用封装把状态字段保护起来,外部只能通过方法去修改,修改前可以做合法性检查。这就是封装的直接价值。

2.2 Python实现封装的三种姿势

第一种,单下划线前缀(_attr),表示“这是受保护成员,外部请不要直接访问”,这是一种约定,代码评审时看到这种成员就应该提醒调用方注意。第二种,双下划线前缀(__attr),会触发名称改写机制,实际生成的名字变成_ClassName__attr,外部直接用原名字访问会报错,这是Python提供的真正“私有”手段。第三种是把成员定义成属性(property),用方法逻辑控制读取和赋值。

举一个用户类的实际案例:

class User: def __init__(self, username: str, age: int): self.__username = username self.__age = age @property def age(self): return self.__age @age.setter def age(self, value): if not isinstance(value, int) or not (0 < value < 150): raise ValueError("age must be a valid int between 1 and 149") self.__age = value @property def username(self): # 对外可以加格式化处理,不影响内部存储 return self.__username.strip()

代码里,age属性用property做了读写拦截,外部赋值时必须走setter的校验逻辑。用户名的getter还顺带做了strip处理,业务方拿到的永远是干净的数据。这种封装让我在后续迭代中改内部存储结构时,完全不用动外部调用方的代码。

2.3 name mangling的细节坑

双下划线私有成员虽然安全了,但有一个常见的坑:子类里如果定义了一个同名双下划线属性,它不会覆盖父类的同名属性,因为名称改写后两者的实际存储名不同。这点在调试时很容易让人困惑。

比如父类有self.__value = 1,子类写self.__value = 2,这两个实际上是两个变量:_Parent__value和_Child__value。如果子类没有重写父类方法,父类方法里访问的仍然是父类那份值。我在刚接触这个机制时就踩过,以为子类赋值后父类方法能读到新值,结果行为完全不符合预期。看清这一点,才能避免在继承链上搞出隐性bug。

还有一个实操心得是property与私有字段配合的模板。我习惯把真正的数据存在私有字段里,property只做暴露层。这样字段命名在类内部可以随意调整,外部接口保持稳定。用一句话概括:封装不仅保护数据,更重要的是让你拥有“明天改变内部实现而不通知外部”的自由。


3. 继承:复用不是复制粘贴

3.1 继承的三种使用场景

我写了这么多年Python,总结出继承真正用得上的地方就三类:抽象公共行为,比如多个模型类都有save、delete方法,就把这些行为放到BaseModel;扩展并覆盖实现,比如基础报表类已经实现了大部分逻辑,子类只需要重写某个算法步骤;接入统一框架,比如在测试框架里,所有测试类都继承TestCase,从而获得框架统一管理的能力。

当然,还有一种很常见的误用——为了“复用”而继承,硬拉父子关系。比如有个狗类和一个猫类,为了复用颜色字段就把猫设计成狗的父类,这种设计在业务语义上就是错的。继承关系的核心是“is-a”,猫不是狗的一个子类型。遇到这种为了复用而强行继承的情况,我更推荐组合,用“has-a”建模。

3.2 super()的调用顺序与MRO

Python的多继承支持是我见过最灵活的之一,但也是翻车率最高的地方。核心是MRO(方法解析顺序),它决定了当多个父类都有同名方法时,Python按照什么顺序去找。Python 3使用C3线性化算法,靠__mro__属性可以查看具体顺序。

我之前做过一个混合功能的类,一个父类是数据库操作基类负责连接管理,另一个父类是缓存处理混入类。两个类都有init方法,当时我在子类里用super().init(),以为只会调用第一个父类的构造,结果两个父类的初始化都执行了,只是顺序不同。多继承的初始化如果设计不当,会出现重复初始化或者漏初始化的问题。

一个稳妥的做法是采用混入类的标准写法,所有参与多继承的类都调用super().init(),把super的调用责任交给每个类自己。这样整条MRO链上的初始化都会被触发。用代码理解更直接:

class DatabaseMixin: def __init__(self, *args, **kwargs): print("DatabaseMixin init") super().__init__(*args, **kwargs) self.conn = None class CacheMixin: def __init__(self, *args, **kwargs): print("CacheMixin init") super().__init__(*args, **kwargs) self.cache = {} class Service(DatabaseMixin, CacheMixin): def __init__(self, *args, **kwargs): print("Service init") super().__init__(*args, **kwargs)

定义Service的实例时,控制台会按Service、DatabaseMixin、CacheMixin的顺序初始化,而且每个父类自己的逻辑都执行了。这就是super()链式协作的精髓。如果不理解MRO,随便调换类的定义顺序,或者有的类漏写super,整个初始化链就会出现诡异问题。

3.3 方法重写与扩展的惯用法

子类重写父类方法时,新手最常见的错误是只写了新逻辑,完全不调用父类原方法,导致父类里的核心行为丢失。比如父类的save方法要写日志、做校验,子类重写后这些步骤全被跳过了。更好的姿势是“先扩展后覆盖”,子类在自己的逻辑之前或者之后,根据需要调用super().父类方法。

class BaseReport: def generate(self): self.prepare() data = self.fetch() return data def prepare(self): print("base prepare") class CSVReport(BaseReport): def prepare(self): # 先执行父类的prepare super().prepare() print("csv extra prepare") report = CSVReport() report.generate()

这种模式在框架开发里非常常见,也是模板方法设计模式的Python化实现。父类定义了算法骨架,子类只负责覆盖特定步骤。调用方调用父类的入口方法,实际执行的是子类改写后的完整逻辑。


4. 多态:把“怎么做”交给对象自己

4.1 鸭子类型是Python多态的底色

“如果它走起来像鸭子、叫起来像鸭子,那它就是鸭子。”这句话是Python多态的精髓。Python是动态语言,调用一个对象的方法时,不检查对象的具体类型,只关心它有没有实现你要调用的方法。

我之前写过一个消息通知模块,最初设计时定义了一个AbstractNotifier抽象类,然后写了EmailNotifier和SMSNotifier两个子类。后来产品要接入一个新的Webhook通知渠道,新增类写完就可以直接上线,完全没动调用方代码。因为调用方只依赖“有send方法”这个约定,这就是鸭子类型的力量。

4.2 抽象基类与接口约束

纯粹的鸭子类型确实自由,但自由过头会出现问题。你传一个没实现send方法的对象进来,跑起来才报AttributeError,这种运行时错误在大型项目里排查成本很高。我现在的做法是:内部公共协议用抽象基类约束,外部边界则用鸭子类型容忍灵活。

Python的abc模块提供了抽象基类机制:

from abc import ABC, abstractmethod class Notifier(ABC): @abstractmethod def send(self, message: str): """发送通知的核心方法""" @abstractmethod def channel_name(self) -> str: """返回渠道名称""" class EmailNotifier(Notifier): def send(self, message: str): print(f"[{self.channel_name()}] {message}") def channel_name(self) -> str: return "email" class SMSNotifier(Notifier): def send(self, message: str): print(f"[{self.channel_name()}] {message}") def channel_name(self) -> str: return "sms"

抽象基类有两个层面的价值:首先,凡是继承Notifier的子类,如果没实现全部抽象方法,实例化时直接抛TypeError,错误从运行时提前到了实例化阶段;其次,抽象基类还能配合isinstance做类型判断,让代码读起来更清晰。我把这种设计叫作“协议明确、实现自由”。

4.3 面向接口编程的调用方写法

为了让多态真正发挥价值,调用方应该尽量面向抽象写代码。以前我写过一个订单导出功能,在业务层直接根据类型switch来调用不同导出方法,代码又长又难维护。后来改成定义统一的导出协议,调用方只调用export方法,内部自动分派到不同的实现。

class PDFExporter: def export(self, order): return "pdf content" class ExcelExporter: def export(self, order): return "excel content" def export_order(exporter, order): return exporter.export(order)

这个场景看似简单,但它代表了多态的精髓:“调用方只定义什么时候做,怎么做由传入的对象自己决定”。这样后续增加新格式时,只需新增类,不用改export_order。代码扩展符合开闭原则,对扩展开放,对修改关闭。


5. 三大特性合体:一个完整的支付案例

5.1 案例结构与设计思路

光讲概念没有说服力,我拿一个支付系统的简化版做案例,把三大特性串起来。需求是这样的:系统支持多种支付渠道,每个渠道都有下单、回调验证、退款三个环节,但是不同渠道的具体实现差异很大。渠道的配置信息不能随便被外部改动,后续还要新增渠道。

我的设计思路是:封装搞定“配置和状态”,继承搞定“公共流程”,多态搞定“渠道差异”。把这个思路落到具体代码上,结构是这样的:

from abc import ABC, abstractmethod class PaymentChannel(ABC): """支付渠道基类:封装共通属性,定义抽象流程""" def __init__(self, config: dict): # 私有字段保护渠道配置 self.__config = dict(config) # 拷贝,避免外部修改原始字典 @property def channel_name(self) -> str: return self.__class__.__name__ def get_config(self, key: str, default=None): return self.__config.get(key, default) def pay(self, amount: float): # 模板方法:定义固定流程,细节由子类实现 self._validate(amount) result = self._do_pay(amount) self._log(result) return result @abstractmethod def _validate(self, amount: float): ... @abstractmethod def _do_pay(self, amount: float): ... def _log(self, result: dict): print(f"[{self.channel_name}] pay result: {result}")

底层基类用双下划线配置字段完成封装,外部只能通过get_config读取,而且传入时做了拷贝,外部改自己的原始字典也影响不到渠道内部状态。pay方法定义的是固定骨架,要求所有子类必须实现_validate和_do_pay两个步骤。

5.2 两个渠道的具体实现

接下来定义两个具体的渠道子类,这是继承的体现,也是多态的基础:

class WechatPay(PaymentChannel): def _validate(self, amount: float): if amount <= 0 or amount > self.get_config("max_amount", 5000): raise ValueError("invalid amount for wechat channel") def _do_pay(self, amount: float): # 模拟调用微信支付接口 return {"channel": self.channel_name, "amount": amount, "status": "success"} class Alipay(PaymentChannel): def _validate(self, amount: float): if amount <= 0 or amount > self.get_config("max_amount", 100000): raise ValueError("invalid amount for alipay channel") def _do_pay(self, amount: float): return {"channel": self.channel_name, "amount": amount, "status": "success"}

两个子类做的事情:保留基类的配置封装能力和日志公共逻辑,只实现各自的校验规则和具体支付调用。因为它们是PaymentChannel的子类型,所以调用方用同一个方式处理它们而不需要关心具体类型。

5.3 调用方的多态使用

最后看调用方怎么写:

def process_payment(channel: PaymentChannel, amount: float): # 这里不检查具体渠道,只调用公共接口 return channel.pay(amount) wechat = WechatPay({"max_amount": 5000, "app_id": "demo"}) alipay = Alipay({"max_amount": 100000, "app_id": "demo2"}) print(process_payment(wechat, 300)) print(process_payment(alipay, 30000))

这段代码的好处很直白:process_payment完全不知道自己在处理哪个渠道,它只依赖PaymentChannel这个抽象约定。新增一个渠道类,比如银行卡支付,只要继承PaymentChannel并实现两个抽象方法,process_payment一行都不用改。我在实际项目中用这种骨架扩展过好几个渠道,每次加渠道都是纯新增,回归风险被控制在一个很小的范围内。


6. 常见问题与排查技巧实录

6.1 高频翻车点速查

我在带团队和做代码评审时,总结出三大特性最常见的坑,整理成一个速查表:

表格可以替换为markdown table格式

问题现象根因解决方案
外部直接改对象内部字段导致状态混乱没有封装或封装约定不明私有化字段,提供读写方法或property
子类重写方法后父类逻辑丢失重写方法时未调用super()遵循先super再扩展的模式
多重继承的方法找不到或顺序混乱没有理解MRO查看__mro__属性,合理调整类定义顺序
实例化子类时报TypeError抽象方法未实现用abc模块,实现全部抽象方法
传入对象没有预期方法,运行时才崩溃鸭子类型约束太弱抽象基类约束+isinstance检查兜底

其中第2条和第3条是我遇到过最多的问题。重写方法忘记super大概占了继承相关bug的一半以上,特别是在刚接手老代码时,很多人看到父类方法里有一些“看起来没用”的逻辑,就直接覆盖掉不再调用,结果间接破坏了一堆隐性约定。

6.2 调试MRO问题的方法

遇到多重继承的诡异问题,我的排查套路比较固定。第一步,打印类的__mro__,确认方法解析顺序是否符合预期。第二步,在每个父类的方法入口加print,实际运行看走了哪条调用链。第三步,检查所有参与多继承的类是否都正确调用了super()。

实际操作里,MRO还有一个让人头大的细节:如果两个父类有同名方法,Python会按照MRO顺序选择第一个。所以不要试图让两个父类的同名方法做“逻辑合并”,除非你用混入类的写法让它们以super链的方式协同。否则,不如明确只在一个父类里定义该方法。

6.3 我的封装习惯和设计建议

最后分享几条偏个人经验的建议,不一定有教科书依据但实测有效。

封装层面,我建议对外用property取代裸字段,即使暂时没有校验逻辑,将来加校验时也无需改动外部代码。这就相当于你一开始就留好了扩展位。

继承层面,优先用抽象基类定义“协议”,用混入类抽离“能力”,减少继承层的深度。我见过五层六层的继承结构,每次改底层一个参数都像打地鼠。继承的深度超过三层就要警惕,看看是不是组合更合适。

多态层面,抽象方法的命名最好表达行为而非类型,比如用send、save、export这种动词,而不是使用type1、method2这种编号式命名。命名清晰才能让调用方读起来像自然语言,多态的价值才能体现出来。

实际开发中,一点一点把这三个特性落实到具体模块里,代码会越来越像一份可维护的说明书。我现在接手新项目的第一件事,就是看核心类的封装边界、继承层次和数据流转方式,眼睛扫完大概就知道这个项目的质量了。写给同样在Python这条路上踩坑的朋友,希望这些经验能帮你少走点弯路。

相关新闻

OA系统源码拆解:从数据库到引擎的审批流程自定义设计

OA系统源码拆解:从数据库到引擎的审批流程自定义设计

简介&#xff1a;一套完整的OA系统源码&#xff0c;专为需要部署或二次开发办公自动化系统的开发者和企业信息化人员准备。项目围绕审批流程定制这一核心需求展开&#xff0c;覆盖请假、报销等常见业务场景&#xff0c;支持根据实际管理流程调整规则。压缩包共2000个文件&#…

2026/10/20 23:52:53 阅读更多 →
Rancher2单机版部署实战:低成本搭建Kubernetes管理平台

Rancher2单机版部署实战:低成本搭建Kubernetes管理平台

前段时间帮一家初创公司搭了一套 Rancher2 单机版的 Kubernetes 管理平台&#xff0c;从采购机器到跑通第一个测试环境&#xff0c;整个过程里有不少值得记录的细节。不少刚起步的团队对 Rancher2 又爱又怕——爱的是它能把 Kubernetes 的多集群管理、权限控制、应用部署都集中…

2026/10/20 23:52:53 阅读更多 →
用AudioContext打造动态音乐播放界面:从解码到频谱可视化

用AudioContext打造动态音乐播放界面:从解码到频谱可视化

1. 先澄清一个概念&#xff1a;AudioContext 不是"HTML5 属性"&#xff0c;而是音频流水线的总开关我见过不少教程喜欢把 AudioContext 挂在"HTML5 新增属性"的名头下&#xff0c;严格说这个说法并不准确。AudioContext 既不是 HTML 标签&#xff0c;也不是…

2026/10/20 23:51:50 阅读更多 →

最新新闻

Vidu Q4 Preview深度评测:AI视频生成迈向生产力工具的关键一步

Vidu Q4 Preview深度评测:AI视频生成迈向生产力工具的关键一步

最近几个创作群里讨论最多的&#xff0c;绕不开Vidu Q4 Preview。做AI视频的同仁应该都有感觉&#xff0c;这个赛道现在卷到什么程度&#xff1a;几乎每隔几天就有新版本、新模型冒出来&#xff0c;但大多是“看起来厉害、一上手就露馅”。Vidu Q4 Preview这次放出的内容&#…

2026/10/21 0:33:56 阅读更多 →
AI在芯片设计中的黑盒困局:一次IR压降事故带来的反思

AI在芯片设计中的黑盒困局:一次IR压降事故带来的反思

芯片世界里&#xff0c;有一句话最近被工程师们重复得越来越多&#xff1a;AI赢了棋局&#xff0c;却讲不出思路。就在上个月&#xff0c;我拿着一个AI辅助完成的block级floorplan给物理设计团队&#xff0c;线长比上一版少了12%&#xff0c;拥塞图也干净得不像话。结果等IR压降…

2026/10/21 0:33:56 阅读更多 →
计算智能体入门:从状态机到Q-learning的决策实现

计算智能体入门:从状态机到Q-learning的决策实现

1. 从零理解计算智能体的核心骨架计算智能体这个概念&#xff0c;听起来像是学术论文里的术语&#xff0c;但把它拆开来看&#xff0c;其实就是一个能感知环境、做出决策、执行动作的软件实体。你可以把它想象成一个在迷宫里找路的小机器人&#xff0c;它能看到周围哪里有墙、哪…

2026/10/21 0:33:55 阅读更多 →
MoE混合专家模型:稀疏激活如何破解大模型容量与成本困局

MoE混合专家模型:稀疏激活如何破解大模型容量与成本困局

从Transformer诞生起&#xff0c;前馈网络&#xff08;FFN&#xff09;就是"又笨重又绕不开"的角色&#xff1a;它占了模型近三分之二的参数量&#xff0c;但每个token都得老老实实把所有参数过一遍。你扩大模型容量&#xff0c;推理成本就跟着线性往上涨&#xff0c…

2026/10/21 0:33:55 阅读更多 →
开源30B模型硬刚闭源旗舰:科研场景实测与本地部署指南

开源30B模型硬刚闭源旗舰:科研场景实测与本地部署指南

最近开源圈又热闹起来了&#xff0c;一个主打科研场景的30B级别开源模型&#xff0c;直接放话要跟两家头部闭源大模型掰手腕。我当时第一反应是“又来一个刷榜的”&#xff0c;但仔细看完技术报告和社区实测数据之后&#xff0c;觉得这波还真不是营销话术&#xff0c;确实有货。…

2026/10/21 0:33:55 阅读更多 →
LLM强化学习全解析:PPO、GRPO、DPO等五类方法选型与实践

LLM强化学习全解析:PPO、GRPO、DPO等五类方法选型与实践

做LLM训练绕不开强化学习这块&#xff0c;标题里这五个字看着简单&#xff0c;真要分类起来其实挺讲究的。我前几年刚开始接触大模型对齐时&#xff0c;也把PPO、DPO、GRPO这些名词搞得晕头转向&#xff0c;后来用了一段时间才理清楚它们之间的血缘关系和适用场景。这篇博文就把…

2026/10/21 0:32:54 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50: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/20 9:50:45 阅读更多 →