Python类和对象进阶:从会写类到会设计类
“类和对象2”这个标题放在目录里翻译成大白话就是类你已经会建了现在该聊聊怎么建得好。很多朋友第一课结束就能写出class Student: pass然后student Student()这种代码觉得面向对象不过如此。但第二课一打开看到类方法、静态方法、特殊方法、property、继承重写、多态这一堆名词整个人就懵在原地。这篇内容我把“类和对象2”这部分拆开揉碎从属性归属讲到继承多态再到调试实战目标是让你学完以后不再只是“会写类”而是“会设计类”。这堂课没有高深到让人劝退但它决定了你和“背语法”之间的真正差距。1. 为什么类和对象要拆成两课讲1.1 第一课和第二课的分界线在哪里第一课教的是语法骨架class关键字长什么样、__init__怎么初始化、self指谁、怎么把一个对象建出来。这些属于“照着抄就能写”的东西。第二课教的是设计骨架属性该放在类里还是实例里、方法该被谁调用、多个类之间怎么组织协作。很多人第一课学完觉得“太简单了”就是因为只掌握了语法外壳没接触真正费脑子的部分。拿宠物举例子。第一课你可能会写一个Dog类里面写了eat()、sleep()、bark()然后很开心地创建了几只狗。第二课你会突然发现如果你还要写Cat类里面又要重复一遍eat()和sleep()这时候就自然产生了一个疑问能不能把公共的吃和睡抽出来放到一个父类里让Dog和Cat只保留自己不同的叫声这个“抽取公共逻辑”的动作就是第二课的核心价值。所以分界线的本质是从“会创建一个类”到“会设计一类对象的体系”。这中间隔着的不是知识点数量而是思维方式的转变。1.2 先看一遍第二课的完整任务清单“类和对象2”通常会覆盖这样一组内容每个点都对应一类具体问题属性归属类属性和实例属性到底有什么区别哪些数据该共享哪些数据该独占。方法类型实例方法、类方法、静态方法分别解决什么问题什么时候用哪个。特殊方法怎么让自定义类支持print()、、for、with这些语言级操作。继承与重写如何从父类提取公共逻辑子类如何做差异化扩展。封装与多态数据访问如何加防线代码如何做到“加新类型不改老逻辑”。把这些点连起来看你会发现它们其实是一条线先搞清楚“单个类内部的数据和方法怎么组织”再搞清楚“多个类之间怎么建立关系”最后落到设计原则和调试实践上。这一课学完之后你再看别人写的业务代码就不会总觉得“这坨代码很怪但说不清哪里怪”了。2. 属性归属与self的本质先分清哪些数据是共享的2.1 类属性和实例属性差在哪先看一段最普通的代码class Student: school 某中学 # 类属性 count 0 # 类属性 def __init__(self, name): self.name name # 实例属性 Student.count 1这里的school和count是类属性属于类本身而name是实例属性每个学生对象都有自己的那一份。访问的时候Python 会先到实例自己的属性字典里找找不到再去类的属性字典里找再找不到就去父类找。区别用一张表看更清楚对比项实例属性类属性定义位置__init__或方法内用self.xxx赋值类体内直接赋值归属每个实例单独一份全类共享一份访问方式self.xxx类名.xxx或self.xxx典型用途每个对象独有的数据如姓名、学号公共配置、计数器、默认值共享的意思要理解透Student.count是全班共享的计数器任何学生对象创建时给它加一这个数是所有实例共同维护的。而s1.name A同学不会影响s2.name因为实例属性天然隔离。2.2 通过实例赋值为什么改不到类属性这是新手第二课最常踩的坑没有之一。class Student: school 某中学 s Student() s.school 某大学 print(Student.school) # 某中学 print(s.school) # 某大学看起来你“改了”school但实际上s.school 某大学这行代码不是在修改类属性而是在s自己的属性字典里新建了一个school把类属性给遮蔽掉了。类属性仍然是“某中学”只是这个实例再也看不到了。如果你真想全局修改必须走类名Student.school 某大学注意区分“读共享”和“写遮蔽”。读的时候实例能顺藤摸瓜找到类属性但一旦用实例做赋值操作就会在自己身上开一块新空间把类属性盖住。面试里经常拿这个点出题答错的人相当多。2.3 三种方法到底怎么选类里除了__init__日常接触最多的是这几种方法class Student: count 0 def __init__(self, name, score): self.name name self.score score Student.count 1 def show_info(self): # 实例方法 return f{self.name} 的分数是 {self.score} classmethod def from_dict(cls, data): # 类方法 return cls(data[name], data[score]) staticmethod def is_valid_score(score): # 静态方法 return 0 score 100选择逻辑其实很朴素实例方法需要读取或修改实例属性方法体里离不开self这是最常见的类型。类方法方法逻辑和类本身相关但不需要某个具体实例装饰器classmethod让它接收的第一个参数是cls而不是self。典型用途是“备选构造函数”比如从字典创建学生对象Student.from_dict({name: 小A, score: 88})这样调用方不用关心类内部的构造细节。静态方法方法逻辑和类、实例都没关系只是恰好放在这个类里而已用staticmethod标记。比如分数是否合法的判断你完全可以在模块级写个普通函数但放在类里更便于调用和组织。很多教程把类方法讲得很玄其实它在真实项目里最常用的场景就是备选构造器和操作类级状态。抓住“第一个参数是 cls 还是 self”这个判断点用起来就不纠结了。3. 特殊方法实战几行代码让类变得好用3.1str__和__repr打印对象时不再看到内存地址新手第一次打印自定义对象多半会得到类似__main__.Student object at 0x7f8c1a2b3c40的输出看着就像天书。这就是因为没有实现特殊方法。class Student: def __init__(self, name, score): self.name name self.score score def __str__(self): return fStudent({self.name}, {self.score}) def __repr__(self): return fStudent(name{self.name!r}, score{self.score!r}) s Student(小A, 92) print(s) # 调用 __str__ print(repr(s)) # 调用 __repr____str__是给用户看的要求简洁易读__repr__是给开发者调试用的理想情况下它的返回值能直接还原出这个对象。如果只实现一个建议优先实现__repr__因为当__str__缺失时Python 会回落到__repr__。注意方法名千万别拼错。__str__写成__str_或者少了魔法方法两侧的双下划线Python 都会把它当成普通方法打印结果依旧是内存地址。3.2 __eq__和比较相关的方法让对象能用比较内容默认情况下比较的是两个对象的身份也就是内存地址。两个学生对象内容一模一样但它们不是同一个对象所以结果是False。这往往不符合业务直觉。class Student: def __init__(self, student_id, name): self.student_id student_id self.name name def __eq__(self, other): if not isinstance(other, Student): return NotImplemented return self.student_id other.student_id这样两个学号相同的学生对象用判断就是相等的。学号是业务上唯一标识学生的东西用它做相等性判断比默认的内存地址靠谱得多。需要注意Python 3 里一旦实现了__eq__对象的__hash__会被自动设为None导致它无法作为字典的 key 或放进 set。如果你希望对象既能比较相等又能正常哈希需要同时定义__hash__。但在大多数业务场景里自定义类用比较内容就够了哈希的问题按需处理不必一开始就把所有魔法方法都堆上去。至于排序自定义类不一定要实现__lt__。我更推荐直接用sorted(students, keylambda s: s.score)key参数让排序逻辑一目了然比在每个类里都实现一堆比较运算符更省事。3.3enter__和__iter让类融入Python语言生态特殊方法真正的威力是让你的类能无缝配合 Python 语法。比如实现__iter__对象就能直接放进for循环里class ScoreSheet: def __init__(self, students): self._students students def __iter__(self): return iter(self._students) sheet ScoreSheet([Student(小A, 92), Student(小B, 85)]) for s in sheet: print(s.name, s.score)__iter__返回一个迭代器iter(self._students)直接复用列表的迭代器即可。这样设计之后调用方不需要关心ScoreSheet内部是用列表还是元组存数据只要它能被遍历就行。同理实现__enter__和__exit__可以让对象配合with语句做资源管理比如自动关闭文件、自动释放连接。这背后的逻辑不复杂但理解了“特殊方法让自定义类融入语言生态”这个思想以后再看到len(obj)、with obj、for x in obj这种写法你就知道它们统统能挂到自定义类身上。4. 继承与重写把公共逻辑收上来把差异逻辑放下去4.1 继承的写法与父子分工继承的第一直觉是“复用代码”但更准确地说它是在表达“is-a”的关系学生是一个人类猫是一个动物类。父类放公共逻辑子类放差异逻辑。class Person: def __init__(self, name, age): self.name name self.age age def introduce(self): return f我叫{self.name}今年{self.age}岁 class Student(Person): def __init__(self, name, age, student_id): super().__init__(name, age) self.student_id student_id def introduce(self): return super().introduce() f学号是{self.student_id}这里Student继承了Person的name、age和introduce同时新增了student_id还重写了introduce在原有基础上追加学号信息。父类的公共逻辑只用写一遍子类各自扩展差异点这就是继承的典型分工。写继承的时候有一个原则很重要如果两个类之间没有明确的“is-a”关系不要为了复用强行继承。比如“订单”和“用户”之间是“属于”的关系不是“是一种”的关系这时候更应该把用户作为订单的属性成员而不是让订单继承用户。组合优于继承是比语法更优先的设计判断。4.2 super().init()为何不能省略很多新手在子类里写了自己的__init__但不调用super().__init__()结果创建子类对象后发现父类里定义的属性全都不存在一脸疑惑。原因是父类的__init__并不会自动执行子类重写了__init__之后父类的初始化逻辑就完全被覆盖了。如果你希望子类对象拥有父类设置的属性就必须显式调用super().__init__(参数)。class Student(Person): def __init__(self, name, age, student_id): # 如果漏掉这一行self.name 和 self.age 都不存在 super().__init__(name, age) self.student_id student_id建议在任何子类重写__init__时第一行就写super().__init__(...)把父类需要参数传进去。这是一种强制性习惯不是可选项。调试时如果发现子类实例缺属性优先检查__init__里有没有调用父类初始化。4.3 重写方法时千万别破坏调用方的预期重写方法不是随心所欲乱改。父类方法相当于对调用方做了契约承诺子类重写后必须保持行为上的兼容。举个反例父类Person.introduce()返回“我叫X今年X岁”子类重写后只返回“我是学生”把名字年龄全丢了调用方本来期望拿到完整介绍的结果信息缺失。这种做法就破坏了调用方对父类的预期。用一句大白话概括凡是能用父类的地方换成任何子类都应该能正常跑。这叫“里氏替换”听起来高大上落到具体写法就是两件事子类方法的返回值、抛出异常的行为要和父类大致兼容。如果只是在父类逻辑前后加点东西优先用super()调用父类方法而不是把整个方法逻辑推倒重写。比如introduce里先super().introduce()拿到原始介绍再拼接学号这种“增强式重写”就是安全的重写方式。5. 封装与多态面向对象的两根定海神针5.1 单下划线与双下划线Python的“私有”到底是怎么回事很多从其他语言转过来的同学第一反应是找private关键字结果发现 Python 没有。它用的是约定和名字重整机制。_name单下划线开头是约定。看到它的人会明白“这是内部成员外部不要直接碰”但它并不会阻止你访问。__name双下划线开头会触发名字重整。在类定义内部它会变成_ClassName__name主要目的是防止子类不小心覆盖父类的内部属性而不是真的加密。class Student: def __init__(self, name): self.__name name s Student(小A) print(s._Student__name) # 小A名字被重整了 print(s.__name) # AttributeError因为类外部访问不到这个原始名字把这段讲清楚能避免新人在调试里看到_Student__name这种奇怪属性时一头雾水。封装在 Python 里的意义不是“绝对禁止访问”而是“明确告知边界”剩下的靠开发者自觉。5.2 property实战给属性加一道校验关卡直接暴露属性虽然方便但无法控制赋值。比如分数属性如果外部直接student.score 150业务逻辑就崩了。用property可以把赋值动作拦截下来做校验class Student: def __init__(self, score): self._score score property def score(self): return self._score score.setter def score(self, value): if not (0 value 100): raise ValueError(分数必须在0到100之间) self._score value s Student(88) s.score 95 # 正常 s.score 150 # 抛出 ValueError外部调用的时候写的是student.score 95看起来还是在直接操作属性但背后已经经过了校验。这就是property最妙的地方接口保持不变内部实现随意升级。将来你想把score改成“平时成绩加期末成绩加权计算”调用方一行代码都不用改。注意内部存的是self._score外部访问的是self.score。命名上故意用单下划线区分“内部存储”和“对外接口”这是 Python 社区很常见的写法。5.3 多态的典型写法只关心方法不关心类型多态用大白话说就是调用方只关心对象会不会某个方法不关心它到底是什么类。class Dog: def sound(self): return 汪汪 class Cat: def sound(self): return 喵喵 class Bird: def sound(self): return 啾啾 def make_sound(animal): print(animal.sound()) make_sound(Dog()) make_sound(Cat()) make_sound(Bird())make_sound函数根本不需要检查传入对象的类型也不要求它们有共同的父类只要你有sound这个方法我就能统一调用。这就是“鸭子类型”走路像鸭子、叫起来像鸭子那它就是鸭子。这种设计带来的好处是扩展性极强。以后想加一个Cow实现sound()返回“哞哞”make_sound一个字都不用改。在真实项目里多态配合继承会更强父类定义了接口子类各自实现不同行为外部代码永远只面向父类接口编程。加新子类、改某一种行为都不会波及调用方。6. 常见报错与排查技巧实录6.1 可变类属性一个实例改了全班数据都变了这是我见过最经典的共享陷阱。class Student: tags [] def __init__(self, name): self.name name s1 Student(小A) s1.tags.append(优等生) s2 Student(小B) print(Student.tags) # [优等生] print(s2.tags) # [优等生]小B莫名也被打上了标签问题出在tags []是类属性所有实例共享同一个列表。一个实例往里append所有实例都能看到变化。解决办法很简单可变属性放到__init__里用self.tags []创建实例独立的列表。排查技巧也很固定如果一个实例修改的数据“波及”到了其他实例十有八九就是可变对象被做成了类属性。检查的时候先看类体里有没有直接定义[]、{}、set()。6.2 __init__的默认参数和返回值两个隐藏雷区可变默认参数是函数层面的经典坑放到类里照样踩def __init__(self, name, tags[]): # 错误示范 self.name name self.tags tags默认参数在函数定义时就创建一次所有没传tags的实例会共享同一个列表。正确写法是把默认值设为Nonedef __init__(self, name, tagsNone): self.name name self.tags tags if tags is not None else []另一个雷区是__init__的返回值。__init__这个方法只能返回None如果写了return 1解释器直接抛TypeError: __init__() should return None。很多人把__init__想象成构造函数觉得可以返回一个对象但实际上创建对象的过程由__new__负责__init__只负责初始化不负责返回东西。6.3 用vars()和dir()快速定位缺属性和隐藏属性排查类相关问题有两个内置工具特别好用。vars(obj)返回对象的属性字典也就是obj.__dict__可以清楚地看到实例上有哪些属性、值是什么。dir(obj)列出对象所有可访问的属性名和方法名包括从父类继承来的。比如子类实例缺属性先执行vars(instance)如果里面没有name、age这些应该存在的键基本可以断定父类__init__没被调用。再比如调试时看到_Student__name这种奇怪属性用dir(obj)能看到全貌就不会觉得代码“见鬼”了。6.4 常见问题速查表现象可能原因排查思路一个实例改了列表其他实例也变了可变对象被定义成类属性检查类体里是否有[]、{}、set()子类实例缺父类的属性子类__init__忘了调用super().__init__()用vars(instance)查看属性字典打印对象输出一串内存地址没实现__str__或__repr__补实现并确认方法名拼写正确两个内容一样的对象用是 False没实现__eq__实现__eq__并定义相等逻辑通过实例给类属性赋值后好像没生效实例属性遮蔽了类属性全局修改必须用类名.属性 新值__init__里return一个非 None 值__init__不允许返回值删掉return语句7. 把类写得更像生产代码的几个习惯7.1 判断一个类设计好坏的三个标准第一一个类能不能用一句话说清它是干什么的。如果答案里出现“还有”“顺便”这些词说明职责不够单一。比如“这个类管理学生信息还负责发邮件”这就是两个职责搅在一起以后任何一个需求变了都要跑来改这个类。第二类之间的关系是组合还是继承。两个类之间如果没有明确的“is-a”关系优先考虑组合。比如“订单”包含“商品列表”这就是组合只有“学生”确实是“人类”的一种继承才合理。第三对外接口是否稳定。类的方法名和参数尽量少变因为外部调用方为了等你改接口要跟着改代码。宁可内部实现翻天覆地也要保持对外方法签名稳定这其实就是封装带来的直接约束。7.2 先写最小可用类再考虑“高大上”特性很多初学者一上来就想写个大而全的类类方法、静态方法、特殊方法、继承全都要用上结果写出来的类又绕又难调。我的建议是先写一个最简单但能跑的类只包含__init__和一个核心业务方法。让它先产生几个对象把数据流跑通。然后再根据实际使用的不方便逐步加__str__、__eq__、property最后再考虑是不是要抽父类。类就是这样一开始只是一个对象工厂用着用着发现很多地方重复了再提炼。与其一开始设计一个“完美”的类不如让它从简单需求里自然生长出来。这种“需求驱动”的做法比“功能堆砌”更能训练设计能力。7.3 学习路径建议怎么把这一课吃透看完这篇别急着翻到下一节立刻做一个综合小练习设计一个Order类包含订单项列表、总价计算、格式化输出实现__str__、按订单号判断相等实现__eq__、支持for遍历所有订单项实现__iter__。再做一个小项目一个MemberOrder继承它多一个会员折扣方法。做完这个第二课的内容你就基本消化了。我每次带新人都会让他们把类和对象的例子在纸上画出“哪些数据属于类哪些数据属于实例”这张图画明白后面继承、多态、property 都顺了。“类和对象2”难不是难在语法难在思维转换从“写流程”切换到“设计类型”。多写、多改、多看别人优秀的代码这个弯你一定会转过来的。

相关新闻

三数之和双指针解法详解:排序、去重与边界条件一次讲清

三数之和双指针解法详解:排序、去重与边界条件一次讲清

很多人第一次刷到“三数之和”这道题,是在找工作的笔试题里。当时我还在想,这不就是三重循环套一下的事吗?等到自己真被问到“三数之和”并要在白板上手写完整解法时,才发现这题的考察点根本不是“会不会三重循环”,而…

2026/10/14 23:47:02 阅读更多 →
深入理解类和对象:构造方法、封装、引用传递与生命周期

深入理解类和对象:构造方法、封装、引用传递与生命周期

类和对象(2)这个标题,放在课程体系里往往是第二讲,但真正写过业务代码的人都知道,这个话题够你啃很久。第一讲大家学会了“class 定义一个类型,new 出一个对象”,看懂了语法,但一落到…

2026/10/14 23:47:02 阅读更多 →
Tidewater海洋渲染原理:四重级联FFT(Tessendorf)在WebGPU Compute上的快速实现

Tidewater海洋渲染原理:四重级联FFT(Tessendorf)在WebGPU Compute上的快速实现

【免费下载链接】tidewater Coastal town built with Opus 5.5 项目地址: https://gitcode.com/gh_mirrors/ti/tidewater 点击查看 免费下载 Tidewater 是一个直接在浏览器运行的海岛钓鱼游戏,它用 WebGPU WGSL 手写了一套渲染引擎,海洋渲染…

2026/10/14 23:45:59 阅读更多 →

最新新闻

基于MP2642GR-Z与PIC18F87K22的2S电池主动均衡模块设计

基于MP2642GR-Z与PIC18F87K22的2S电池主动均衡模块设计

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

2026/10/15 1:14:56 阅读更多 →
SPFA负环检测实战:POJ 2240套利问题与对数转化技巧

SPFA负环检测实战:POJ 2240套利问题与对数转化技巧

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

2026/10/15 1:14:56 阅读更多 →
Android本地MP3播放器实战:MediaPlayer状态机与前台服务设计

Android本地MP3播放器实战:MediaPlayer状态机与前台服务设计

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

2026/10/15 1:14:56 阅读更多 →
51单片机汽车自动照明系统:光敏+超声波协同远近光智能控制

51单片机汽车自动照明系统:光敏+超声波协同远近光智能控制

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

2026/10/15 1:14:56 阅读更多 →
SLS只读助手:会话权与日志读权限拆开

SLS只读助手:会话权与日志读权限拆开

人只能给指定数字员工开会话,员工再用单独角色读日志。两层写进同一条策略,就会出现打得开却查不到,或者名单可见的库被整库读走。 目录 前言 一、会话权和读日志权拆开 二、开工前只读盘点 三、角色只读指定 Logstore 四、人的策略只绑一组、只对一名员工

2026/10/15 1:14:56 阅读更多 →
Apollo-11 自动化任务调度框架:状态机与插件化设计实践

Apollo-11 自动化任务调度框架:状态机与插件化设计实践

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

2026/10/15 1:13:56 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →