面向对象有三大特性封装、继承、多态。老哥逐个讲最后用一个完整的 愤怒的小鸟 项目把它们串起来。一、封装把细节藏起来只留接口封装就是把属性和方法写进类里同时隐藏细节只暴露必要的接口。核心是私有化。单下划线_var约定 非公开 API只是约定不强制。双下划线__var会触发名称改写变成_类名__var类外部访问不到除非用改写的名字class Person: def __init__(self, name): self.__name name # 私有属性 def get_name(self): return self.__name p Person(张三) print(p.get_name()) # 张三 通过公有方法访问 print(p._Person__name) # 张三 名称改写后的名字不推荐 print(p.__name) # 报错外部访问不到私有方法同理def __private_method(self)外部p.__private_method()会报错。二、property把方法变成属性用property装饰方法就能像属性一样调用不加括号。这通常配合私有属性做只读class Person: def __init__(self, name): self.__name name property def name(self): # 方法名去掉双下划线 return self.__name p Person(张三) print(p.name) # 张三 像属性一样读 p.name 李四 # 报错只读没有 setter加上name.setter就能读写还能在里面做校验拦截class Person: def __init__(self, name): self.__name name property def name(self): return self.__name name.setter def name(self, name): if name 李四: print(不许叫李四) else: self.__name name p Person(张三) p.name 李四 # 提示 不许叫李四 print(p.name) # 张三 没改成 p.name 王五 # 成功 print(p.name) # 王五⚠️ 大坑property的方法名不要和变量重名否则会无限递归报RecursionError。三、继承子类复用父类还能改造子类派生类继承父类基类的属性和方法实现代码重用还能新增、重写方法。注意子类继承不到父类的私有成员名称改写所致。单继承在类名括号里写父类class Person: home earth def __init__(self, name): self.name name def eat(self): print(eating...) class YellowRace(Person): # 继承 Person color yellow y1 YellowRace(张三) print(y1.home, y1.color, y1.name) # earth yellow 张三 y1.eat() # eating... 继承来的方法多继承父类从左到右查找方法class ChineseStudent(Student, YellowRace): # 继承两个父类 country 中国 y1 ChineseStudent(张三, 三年级) y1.eat() # 来自 Person y1.run() # 来自 YellowRace y1.study() # 来自 Student复用父类方法用super().方法名()或父类名.方法名(self)class Student(Person): def study(self): print(先吃再学) super().eat() # 调用父类 Person 的 eat() print(studying...)方法解析顺序 MRO用类名.__mro__看继承链决定方法查找顺序print(ChineseStudent.__mro__) # (ChineseStudent, Student, YellowRace, Person, object)方法重写子类定义同名方法调用时就用自己的。注意重写__init__后父类的__init__不会自动执行需要手动super().__init__()class Chinese(Person): def __init__(self, name, area): super().__init__(name) # 手动调父类初始化 self.area area四、多态同一接口不同表现同一事物在不同场景下呈现不同状态。同一个go()方法不同动物跑出不同效果class Animal: def go(self): pass class Dog(Animal): def go(self): print(跑) class Fish(Animal): def go(self): print(游) class Bird(Animal): def go(self): print(飞) def go(animal): animal.go() # 传入不同实例执行不同方法 go(Dog()); go(Fish()); go(Bird()) # 跑 / 游 / 飞五、综合实战愤怒的小鸟把三大特性全用上。基类Birds抽象 封装子类红黄蓝鸟继承 重写 → 多态Obstacle类负责和小鸟交互# 鸟类基类 class Birds: def __init__(self, name, color, skill_description): self.name name self.color color self.skill_description skill_description def fly(self): print(f{self.name} 正在飞行...) def call(self): print(f{self.name} 发出叫声...) def use_skill(self): print(f{self.name} 使用了技能{self.skill_description}) # 红鸟 class RedBirds(Birds): def __init__(self): super().__init__(红火, 红色, 撞击前方障碍物造成大量伤害) def fly(self): print(红火以稳定的速度向前飞行...) def call(self): print(红火发出 wei呀.... 的叫声) # 黄鸟 class YellowBirds(Birds): def __init__(self): super().__init__(小黄, 黄色, 瞬间加速穿透薄障碍物) def fly(self): print(小黄快速向前飞行...) def call(self): print(小黄发出 啾啾啾.... 的叫声) # 蓝鸟 class BlueBirds(Birds): def __init__(self): super().__init__(小蓝, 蓝色, 分裂成三只小鸟分散攻击) def fly(self): print(小蓝优雅地向前飞行...) def call(self): print(小蓝发出 叽叽叽.... 的叫声) # 障碍物类 class Obstacle: def __init__(self, name, strength): self.name name self.strength strength def be_attacked(self, bird): print(f{bird.name} 冲向了 {self.name}) bird.use_skill() # 多态不同鸟用不同技能 if isinstance(bird, RedBirds): damage 80 elif isinstance(bird, YellowBirds): damage 50 elif isinstance(bird, BlueBirds): damage 30 * 3 # 分裂成三只 self.strength - damage if self.strength 0: print(f{self.name} 被摧毁了) else: print(f{self.name} 还剩余 {self.strength} 点强度) # 模拟游戏 if __name__ __main__: red_bird RedBirds() yellow_bird YellowBirds() blue_bird BlueBirds() obstacle1 Obstacle(木头堡垒, 100) obstacle2 Obstacle(石头塔楼, 200) obstacle1.be_attacked(red_bird) # 红鸟打木头堡垒 obstacle2.be_attacked(yellow_bird) # 黄鸟打石头塔楼 obstacle2.be_attacked(blue_bird) # 蓝鸟打石头塔楼老哥收尾三大特性一句话封装藏细节私有 property 控读写、继承复用父类super 调父类、可重写、多态同接口不同表现一个 go 方法跑游飞。用 愤怒的小鸟 把继承、重写、多态、对象交互全串起来了。下一篇讲错误和异常—— 程序崩了别慌try-except 帮你兜底。有问题随时回来找老哥。
企业数字化 ERP 产品动态
相关推荐
OCPP1.6 StartTransaction 启动充电失败全场景排查 OCPP1.6 StartTransaction 启动充电失败全场景排查 标签:java websocket OCPP1.6 充电桩 CSMS StartTransaction 充电事务 简介:鉴权通过、枪也插上了,用户点"开始充电",平台却怎么都不开账,这是联调里最让人… · 2026/11/4 12:05:57
【Linux操作系统】进程篇(七):环境变量:程序运行时的那些信息,到底从哪里来? 一、先认识环境变量:它到底是什么?
先建立一个流程接下来细节理解
我们平时使用 Linux 的时候,经常会输入各种命令,比如:
ls
pwd
gcc这些命令都可以直接运行。但是,当我们自己写了一个 C 语言程序ÿ… · 2026/11/4 12:05:57
现代爬虫技术:Selenium处理JavaScript渲染与反爬策略 1. 为什么现代爬虫必须处理JavaScript渲染? 十年前我刚入行做爬虫的时候,90%的网站直接requestsBeautifulSoup就能搞定。但现在打开Chrome开发者工具随便看个电商网站,满屏的XHR请求和动态加载的JSON数据都在提醒我们:传统爬虫技术… · 2026/11/4 12:45:30
Cybersecurity期刊投稿全流程:定位、审稿与返修策略 1. 先搞清楚这本刊在学术版图里到底站在哪个位置1.1 从刊名开始的第一层误读Cybersecurity 这个词写在刊名上,绝大多数人第一反应是"安全领域的综合大刊",然后拿它去对标那些办了二三十年、影响因子长期稳定在高位的老牌安全刊物。我第一次接触… · 2026/11/4 12:45:30
跨模态检索技术与以图搜图系统架构详解 1. 跨模态检索技术全景解析 当你在电商平台用手机拍下街边橱窗里的同款包包,或是用一段文字描述在视频库里精准定位某个片段时,背后发挥作用的正是跨模态检索技术。这项技术正在重塑我们与数字世界的交互方式,其核心在于建立不同模态数据&… · 2026/11/4 12:45:30
大模型解数学题的底层原理:从语言建模到思维链涌现 1. 一个反直觉的起点:数学题不是“算出来”的,而是“生成出来的” 很多人第一次看到大模型解出微分方程或组合数列题时,下意识会想:“它是不是内置了Mathematica内核?”“是不是偷偷调用了SymPy?”——这种… · 2026/11/4 12:45:30
CPXS三表十四题:SQL嵌套查询、NOT EXISTS与避坑实践 简介:《数据库实验5嵌套查询》是一份面向数据库课程学习者与实验教学场景的文档型实验报告,围绕CPXS数据库展开统计查询、连接查询与嵌套查询的训练,适合正在学习SQL查询、准备课程实验或需要巩固查询语法的高校学生与自学者参考。资源包共1个… · 2026/11/4 12:45:30
WEKA数据挖掘入门:ARFF格式、预处理与J48分类基线 简介:面向初学数据挖掘、准备上手 WEKA 的读者,这份文档围绕“weak 操作入门”梳理平台的基本概念与操作路径,适合作为课程实验、自学入门或数据分析的前置阅读。压缩包仅含 1 个 doc 文件,约 172KB,篇幅集中ÿ… · 2026/11/4 12:44:30
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38