Python面向对象编程(OOP):从入门到精通
1. 面向对象编程概述面向对象编程Object-Oriented Programming, OOP是一种以对象为核心的编程范式。它将数据和操作数据的方法封装在一起形成“对象”。与面向过程编程相比OOP更贴近现实世界的建模能有效提高代码的可重用性、可维护性和可扩展性。Python是一门完全支持OOP的动态语言其OOP实现简洁而强大。理解OOP是成为Python高级开发者的必经之路。2. 类与对象一切的基础2.1 定义类与创建对象类是对象的蓝图或模板对象是类的实例。# 定义一个简单的类 class Dog: # 类属性所有实例共享 species Canis familiaris # 初始化方法构造器 def __init__(self, name, age): # 实例属性 self.name name self.age age 实例方法 def bark(self): return f{self.name} says: Woof! 创建对象实例化 my_dog Dog(Buddy, 3) print(my_dog.name) # 输出: Buddy print(my_dog.bark()) # 输出: Buddy says: Woof! print(my_dog.species) # 输出: Canis familiaris2.2 self关键字与实例方法self代表类的实例本身在实例方法中必须作为第一个参数。通过self可以访问实例的属性和其他方法。class Calculator: def __init__(self): self.result 0 def add(self, value): self.result value return self def multiply(self, value): self.result * value return self def get_result(self): return self.result calc Calculator() final calc.add(5).multiply(3).add(10).get_result() print(final) # 输出: 253. 面向对象三大特性3.1 封装Encapsulation封装是将数据属性和操作数据的方法行为捆绑在一起并对外隐藏内部实现细节。在Python中主要通过命名约定来实现访问控制。class BankAccount: def __init__(self, owner, balance0): self.owner owner self._balance balance # 受保护属性单下划线约定 self.__account_id id(self) # 私有属性双下划线名称修饰 def deposit(self, amount): if amount 0: self._balance amount return True return False def withdraw(self, amount): if 0 amount self._balance: self._balance - amount return True return False 公共接口getter def get_balance(self): return self._balance account BankAccount(Alice, 1000) print(account.get_balance()) # 输出: 1000 print(account.__account_id) # 报错AttributeError 但可以通过名称修饰访问不推荐: _BankAccount__account_id3.2 继承Inheritance继承允许一个类子类获取另一个类父类的属性和方法实现代码复用和层次化设计。# 父类基类 class Animal: def __init__(self, name): self.name name def speak(self): raise NotImplementedError(子类必须实现此方法) 子类派生类 class Dog(Animal): def speak(self): return f{self.name} says Woof! class Cat(Animal): def speak(self): return f{self.name} says Meow! 使用 animals [Dog(Buddy), Cat(Whiskers)] for animal in animals: print(animal.speak()) 输出: Buddy says Woof! Whiskers says Meow!3.2.1 方法重写Override与super()class Vehicle: def __init__(self, brand, model): self.brand brand self.model model def info(self): return f{self.brand} {self.model} class ElectricCar(Vehicle): def init(self, brand, model, battery_capacity): # 调用父类的__init__ super().init(brand, model) self.battery_capacity battery_capacity # 重写父类方法 def info(self): base_info super().info() return f{base_info} (Electric, {self.battery_capacity}kWh) tesla ElectricCar(Tesla, Model 3, 75) print(tesla.info()) # 输出: Tesla Model 3 (Electric, 75kWh)3.2.2 多重继承与MRO方法解析顺序class A: def show(self): print(A) class B(A): def show(self): print(B) super().show() class C(A): def show(self): print(C) super().show() class D(B, C): def show(self): print(D) super().show() d D() d.show() 输出顺序遵循C3线性化算法: D B C A print(D.mro) # 查看方法解析顺序 输出: (class main.D, class main.B, class main.C, class main.A, class object)3.3 多态Polymorphism多态指同一操作作用于不同的对象可以有不同的解释和执行结果。在Python中多态主要通过“鸭子类型”实现。class PDFExporter: def export(self, data): return f导出PDF: {data} class CSVExporter: def export(self, data): return f导出CSV: {data} class JSONExporter: def export(self, data): return f导出JSON: {data} 多态的使用 exporters [PDFExporter(), CSVExporter(), JSONExporter()] data 销售报告 for exporter in exporters: print(exporter.export(data)) 输出: 导出PDF: 销售报告 导出CSV: 销售报告 导出JSON: 销售报告4. 类与实例的高级特性4.1 类方法与静态方法class MyClass: class_attribute 类属性 def __init__(self, value): self.instance_attribute value 实例方法接收self操作实例 def instance_method(self): return f实例属性: {self.instance_attribute} 类方法接收cls操作类本身用classmethod装饰 classmethod def class_method(cls): return f类属性: {cls.class_attribute} 静态方法不接收self或cls只是逻辑上属于类用staticmethod装饰 staticmethod def static_method(): return 这是一个静态方法 obj MyClass(实例值) print(obj.instance_method()) # 实例属性: 实例值 print(MyClass.class_method()) # 类属性: 类属性 print(MyClass.static_method()) # 这是一个静态方法4.2 属性装饰器property将方法“伪装”成属性实现更优雅的getter、setter、deleter。class Circle: def __init__(self, radius): self._radius radius property def radius(self): 获取半径 return self._radius radius.setter def radius(self, value): 设置半径需为正数 if value 0: raise ValueError(半径必须为正数) self._radius value property def area(self): 计算面积只读属性 return 3.14159 * self._radius ** 2 property def diameter(self): 直径只读属性 return 2 * self._radius circle Circle(5) print(circle.radius) # 5 print(circle.area) # 78.53975 circle.radius 10 print(circle.area) # 314.159 circle.area 100 # 报错AttributeError: cant set attribute5. 魔术方法特殊方法以双下划线开头和结尾的方法用于实现类的特殊行为。class Vector: def __init__(self, x, y): self.x x self.y y # 字符串表示 def __str__(self): return fVector({self.x}, {self.y}) def repr(self): return fVector({self.x}, {self.y}) 算术运算 def add(self, other): return Vector(self.x other.x, self.y other.y) def sub(self, other): return Vector(self.x - other.x, self.y - other.y) def mul(self, scalar): return Vector(self.x * scalar, self.y * scalar) 比较运算 def eq(self, other): return self.x other.x and self.y other.y def lt(self, other): # 比较模长 return (self.x2 self.y2) (other.x2 other.y2) 容器模拟 def len(self): return 2 # 二维向量 def getitem(self, index): if index 0: return self.x elif index 1: return self.y else: raise IndexError(Vector索引只能是0或1) v1 Vector(2, 3) v2 Vector(4, 5) print(v1 v2) # Vector(6, 8) print(v1 * 3) # Vector(6, 9) print(v1 Vector(2, 3)) # True print(v1[0]) # 26. 抽象基类ABC与接口设计from abc import ABC, abstractmethod 定义抽象基类 class Shape(ABC): abstractmethod def area(self): pass abstractmethod def perimeter(self): pass 抽象基类也可以有具体方法 def describe(self): return f这是一个形状面积{self.area()}周长{self.perimeter()} 具体实现 class Rectangle(Shape): def init(self, width, height): self.width width self.height height def area(self): return self.width * self.height def perimeter(self): return 2 * (self.width self.height) class Circle(Shape): def init(self, radius): self.radius radius def area(self): return 3.14159 * self.radius ** 2 def perimeter(self): return 2 * 3.14159 * self.radius 使用 shapes [Rectangle(4, 5), Circle(3)] for shape in shapes: print(shape.describe()) 输出: 这是一个形状面积20周长18 这是一个形状面积28.27431周长18.849547. 混入类Mixin与组合# 混入类提供特定功能 class JSONSerializableMixin: def to_json(self): import json return json.dumps(self.__dict__) class XMLSerializableMixin: def to_xml(self): # 简化实现 attrs .join([f{k}{v} for k, v in self.dict.items()]) return fobject {attrs}/ 日志混入 class LoggableMixin: def log(self, message): print(f[LOG] {self.class.name}: {message}) 使用混入 class Product(JSONSerializableMixin, LoggableMixin): def init(self, name, price): self.name name self.price price def apply_discount(self, percent): self.price * (1 - percent/100) self.log(f应用{percent}%折扣新价格: {self.price}) product Product(Laptop, 1000) print(product.to_json()) # {name: Laptop, price: 1000} product.apply_discount(10) # [LOG] Product: 应用10%折扣新价格: 900.08. 描述符Descriptor描述符是实现属性访问控制的底层机制property就是基于描述符实现的。# 自定义描述符验证整数范围 class RangeValidator: def __init__(self, min_value, max_value): self.min_value min_value self.max_value max_value self.data {} def __get__(self, obj, objtypeNone): if obj is None: return self return self.data.get(id(obj)) def set(self, obj, value): if not (self.min_value value self.max_value): raise ValueError(f值必须在{self.min_value}到{self.max_value}之间) self.data[id(obj)] value def delete(self, obj): del self.data[id(obj)] class Person: age RangeValidator(0, 150) score RangeValidator(0, 100) def init(self, name, age, score): self.name name self.age age # 触发描述符的__set__ self.score score p Person(Alice, 25, 85) print(p.age) # 25 p.age 200 # ValueError: 值必须在0到150之间 p.score -10 # ValueError: 值必须在0到100之间9. 元类Metaclass元类是“类的类”用于控制类的创建行为。# 自定义元类自动注册所有子类 class PluginRegistry(type): plugins [] def __new__(cls, name, bases, attrs): new_class super().__new__(cls, name, bases, attrs) if name ! BasePlugin: # 不注册基类 cls.plugins.append(new_class) return new_class 使用元类 class BasePlugin(metaclassPluginRegistry): pass class EmailPlugin(BasePlugin): def execute(self): print(发送邮件) class SMSPlugin(BasePlugin): def execute(self): print(发送短信) print(f已注册插件: {[p.name for p in PluginRegistry.plugins]}) 输出: 已注册插件: [EmailPlugin, SMSPlugin]10. 综合实战简易电商系统设计from abc import ABC, abstractmethod from datetime import datetime from typing import List 抽象基类 class Product(ABC): def init(self, name: str, price: float): self.name name self._price price property def price(self): return self._price abstractmethod def get_description(self): pass 具体产品类 class Book(Product): def init(self, name: str, price: float, author: str, pages: int): super().init(name, price) self.author author self.pages pages def get_description(self): return f《{self.name}》- {self.author}著共{self.pages}页 class Electronics(Product): def __in

相关新闻

GitHub Desktop 汉化终极指南:用一款开源工具,5 分钟让英文界面彻底说中文

GitHub Desktop 汉化终极指南:用一款开源工具,5 分钟让英文界面彻底说中文

GitHub Desktop 汉化终极指南:用一款开源工具,5 分钟让英文界面彻底说中文 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 【GitHub桌面客户端中文汉化】 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDesktop2Chi…

2026/9/26 17:37:52 阅读更多 →
让浏览器替你投简历:Get Jobs 如何把四个招聘平台的重复劳动压缩到一个按钮

让浏览器替你投简历:Get Jobs 如何把四个招聘平台的重复劳动压缩到一个按钮

让浏览器替你投简历:Get Jobs 如何把四个招聘平台的重复劳动压缩到一个按钮 【免费下载链接】get_jobs 💼【AI找工作助手】全平台自动投简历脚本:(boss、前程无忧、猎聘、智联招聘) 项目地址: https://gitcode.com/gh_mirrors/ge/get_jobs …

2026/9/28 0:12:27 阅读更多 →
微信防撤回其实很简单:3分钟用 RevokeMsgPatcher 留住被撤回的消息

微信防撤回其实很简单:3分钟用 RevokeMsgPatcher 留住被撤回的消息

微信防撤回其实很简单:3分钟用 RevokeMsgPatcher 留住被撤回的消息 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https:…

2026/10/4 1:53:36 阅读更多 →

最新新闻

Vue3电子签名组件实战:从Canvas原理到前后端对接

Vue3电子签名组件实战:从Canvas原理到前后端对接

电子签名这个需求,在Vue项目里出现的频率比我预想的高得多。最早我是在一个审批系统里接到这个任务,当时第一反应是直接找一个开源的签名组件,但搜来搜去,要么是React版,要么是jQuery时代的老古董,勉强能用…

2026/10/4 10:54:29 阅读更多 →
SFP+光模块四维匹配:波长/协议/厂商/距离实战指南

SFP+光模块四维匹配:波长/协议/厂商/距离实战指南

1. SFP光模块不是“插上就能用”的标准件,而是需要精密匹配的通信子系统很多人第一次接触SFP光模块时,会下意识把它当成U盘——只要接口对得上(LC口、SFP金手指),往交换机光口一插,灯亮了就以为万事大吉。我…

2026/10/4 10:54:29 阅读更多 →
使用Julia 1前必知的5个边界:决策模型的能力与短板完整清单

使用Julia 1前必知的5个边界:决策模型的能力与短板完整清单

使用Julia 1前必知的5个边界:决策模型的能力与短板完整清单 【免费下载链接】Julia-1 项目地址: https://ai.gitcode.com/hf_mirrors/SupersonicLabs/Julia-1 Julia 1 是 Supersonic Labs 推出的 1.44 亿参数决策模型,核心能力是把一段上下文、一…

2026/10/4 10:54:29 阅读更多 →
MATLAB图例加标题完全指南:从入门到批量绘图自动化

MATLAB图例加标题完全指南:从入门到批量绘图自动化

很多刚接触 MATLAB 绘图的朋友,在画完一张包含多条曲线的图之后,总会遇到一个尴尬的处境:图例(legend)里好几个条目,光靠线条颜色和线型去猜,很容易搞混。更别提那种多组实验数据叠加的图&#…

2026/10/4 10:54:29 阅读更多 →
WeChatMsg 微信聊天记录导出教程:3 个命令免费导出 HTML、Word、CSV,附年度聊天报告

WeChatMsg 微信聊天记录导出教程:3 个命令免费导出 HTML、Word、CSV,附年度聊天报告

WeChatMsg 微信聊天记录导出教程:3 个命令免费导出 HTML、Word、CSV,附年度聊天报告 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https…

2026/10/4 10:54:29 阅读更多 →
动力总成悬置解耦计算:MATLAB与Adams双路线实战对比

动力总成悬置解耦计算:MATLAB与Adams双路线实战对比

做动力总成悬置设计的朋友,对解耦计算应该再熟悉不过了。这两年我经常收到类似的私信:“悬置解耦到底用MATLAB算还是Adams算?”“两款工具算出来的结果差别大不大?”“有没有现成的计算流程能直接抄?”今天就把我在实际…

2026/10/4 10:53:28 阅读更多 →

日新闻

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/4 1:00:58 阅读更多 →
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/4 1:00:58 阅读更多 →
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/4 1:00:58 阅读更多 →

周新闻

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/4 1:00:58 阅读更多 →
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/4 1:00:58 阅读更多 →
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/4 1:00: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/2 10:36:31 阅读更多 →
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/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练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/3 9:42:36 阅读更多 →