从入门到精通:Python 面向对象编程完全指南

从入门到精通:Python 面向对象编程完全指南

作为 Python 编程的核心思想之一,面向对象编程(OOP)以其贴近现实世界的思维方式、高可复用性和易维护性,成为大型项目开发的首选范式。本文将从基础概念到高级特性,带您系统掌握 Python 面向对象编程,结合实战案例帮您真正学以致用。

一、面向对象编程入门:思维转变是关键

1. 两种编程思想的碰撞

编程本质是用计算机解决现实问题的思维方式,Python 同时支持两种核心思想:

  • 面向过程:侧重 "步骤",像按菜谱做菜一样,一步步拆解任务并实现,适合简单脚本开发;
  • 面向对象:侧重 "对象",将现实事物抽象为包含属性(特征)和方法(行为)的对象,通过操作对象解决问题,更适合复杂系统。

举个直观例子:去 ATM 机取钱

  • 面向过程思维:带卡→去 ATM 机→排队→插卡→输密码→取钱→返回;
  • 面向对象思维:操作 "银行卡"(属性:卡号、密码;方法:验证)和 "ATM 机"(属性:位置、余额;方法:插卡、取款)两个核心对象,无需关注具体步骤细节。

2. 核心概念:类与对象

面向对象的世界里,一切皆对象,而类是对象的抽象模板:

  • :看不见摸不着的抽象描述,比如 "手机" 类定义了所有手机共有的属性(品牌、颜色)和方法(开机、拍照);
  • 对象:看得见摸得着的具体实体,比如 "我的 iPhone 14" 就是 "手机" 类的一个实例。
基本语法实现

python

运行

# 定义类:抽象模板 class Phone: # 方法:对象的行为 def open(self): print("手机正常开机啦~") def take_photo(self): print("咔嚓!记录美好瞬间") def close(self): print("关机休息,节约电量") # 创建对象:具体实体 my_phone = Phone() # 调用方法:操作对象 my_phone.open() my_phone.take_photo() my_phone.close() 

3. 必懂关键字:self 的核心作用

self 是 Python 面向对象的灵魂关键字,它始终指向当前对象实例本身:

  • 区分不同对象:一个类可以创建多个对象,self 能明确当前操作的是哪个对象;
  • 访问对象成员:在类内部通过self.属性名访问属性,self.方法名()调用方法。

二、核心技能:属性与魔法方法

1. 对象属性的操作

属性是对象的固有特征,比如手机的品牌、人的年龄,操作方式分两种场景:

类内部操作:通过self.属性名访问python运行

class Car: def show_info(self): # 访问对象的color属性 print(f"车辆颜色:{self.color}") my_car = Car() my_car.color = "红色" my_car.show_info() # 输出:车辆颜色:红色 

类外部操作:直接通过对象名.属性名添加和获取python运行

# 给对象添加属性 my_phone.brand = "华为" my_phone.color = "黑色" # 获取对象属性 print(f"手机品牌:{my_phone.brand},颜色:{my_phone.color}") 

2. 魔法方法:让类更强大

Python 中被双下划线包围的方法称为魔法方法,它们会在特定场景自动调用,无需手动触发:

__del__():析构方法删除对象或程序结束时自动调用,用于释放资源:python运行

class Dog: def __del__(self): print("对象已被销毁,资源释放完成") dog = Dog() del dog # 触发__del__方法,输出对应提示 

__str__():字符串格式化方法打印对象时自动调用,默认打印内存地址,重写后可自定义输出格式:python运行

class Car: def __init__(self, color, number): self.color = color self.number = number def __str__(self): return f"颜色:{self.color},轮胎数:{self.number}" my_car = Car("白色", 4) print(my_car) # 输出:颜色:白色,轮胎数:4 

__init__():初始化方法创建对象时自动执行,用于初始化对象属性,支持无参和有参两种形式:python运行

class Student: # 有参初始化:创建对象时直接赋值 def __init__(self, name, age): self.name = name self.age = age # 创建对象时传递参数 stu = Student("小明", 18) print(f"姓名:{stu.name},年龄:{stu.age}") 

三、面向对象三大特性:封装、继承、多态

这三大特性是面向对象编程的核心价值所在,也是写出高质量代码的关键。

1. 封装:数据安全与代码复用

封装是将属性和方法写入类中,并可设置访问权限,核心意义是 "明确内外边界":

  • 私有成员:在属性或方法名前加__,只能在类内部使用,外部无法直接访问;
  • 访问接口:通过get_xx()获取私有属性,set_xx()修改私有属性,可在接口中添加校验逻辑。
实战案例:封装个人信息类

python

运行

class People: def __init__(self, name, age): # 私有属性:外部无法直接修改 self.__name = name self.__age = age # 获取私有属性 def get_name(self): return self.__name # 修改私有属性:添加类型校验 def set_age(self, age): if not isinstance(age, int): print("年龄必须是整数类型!") return if age < 0 or age > 120: print("年龄范围不合法!") return self.__age = age # 私有方法:内部逻辑封装 def __check_info(self): return len(self.__name) > 0 and 0 < self.__age < 120 # 公共方法:对外提供接口 def show_info(self): if self.__check_info(): print(f"姓名:{self.__name},年龄:{self.__age}") else: print("信息不完整或不合法") # 使用示例 p = People("Jack", 30) p.show_info() # 输出:姓名:Jack,年龄:30 p.set_age(35) # 合法修改 p.set_age("35") # 输出:年龄必须是整数类型! 

2. 继承:站在巨人的肩膀上

继承允许子类直接复用父类的属性和方法,同时可扩展自己的特性,实现代码复用:

  • 单继承:一个子类继承一个父类(最常用);
  • 多继承:一个子类继承多个父类(Python 支持,需注意 MRO 方法解析顺序);
  • 方法重写:子类定义与父类同名的方法,覆盖父类逻辑;
  • super () 函数:调用父类的属性和方法,避免硬编码父类名。
实战案例:动物类继承体系

python

运行

# 父类:抽象动物 class Animal: def __init__(self, name, age): self.name = name self.age = age def eat(self): print(f"{self.name}正在进食...") def call(self): print(f"{self.name}发出叫声...") # 子类:狗,继承自Animal class Dog(Animal): # 重写父类方法 def call(self): print(f"{self.name}汪汪叫~") # 扩展子类特有方法 def guard(self): print(f"{self.name}正在看家护院!") # 子类:猫,继承自Animal class Cat(Animal): # 重写父类方法 def call(self): print(f"{self.name}喵喵叫~") # 扩展子类特有方法 def catch_mouse(self): print(f"{self.name}正在抓老鼠!") # 使用示例 dog = Dog("旺财", 3) dog.eat() # 继承父类方法 dog.call() # 调用重写方法 dog.guard() # 调用子类特有方法 cat = Cat("咪宝", 2) cat.call() # 调用重写方法 cat.catch_mouse() # 调用子类特有方法 

3. 多态:灵活应对变化

多态是指同一类事物的多种形态,核心是 "同一接口,不同实现":

  • 实现条件:存在继承关系、子类重写父类方法、父类引用指向子类对象;
  • 核心价值:提高代码可扩展性,无需修改原有框架即可添加新功能。
实战案例:多态在工作场景中的应用

python

运行

# 父类:抽象狗类 class Dog: def work(self): print("执行任务...") # 子类:军犬 class ArmyDog(Dog): def work(self): print("追击敌人,执行军事任务!") # 子类:缉毒犬 class DrugDog(Dog): def work(self): print("搜查毒品,维护社会治安!") # 人类:与狗协作 class Person: def work_with_dog(self, dog): # 统一接口,自动适配不同子类 dog.work() # 使用示例 army_dog = ArmyDog() drug_dog = DrugDog() p = Person() p.work_with_dog(army_dog) # 输出:追击敌人,执行军事任务! p.work_with_dog(drug_dog) # 输出:搜查毒品,维护社会治安! 

四、高级特性:类属性、类方法与静态方法

除了实例属性和实例方法,Python 还提供了类级别的成员,满足更多场景需求:

1. 类属性:类共享的属性

类属性属于整个类,被所有对象共享,常用于存储类级别的公共数据:

python

运行

class Tool: # 类属性:记录创建的工具对象数量 count = 0 def __init__(self, name): self.name = name # 操作类属性:通过类名访问 Tool.count += 1 # 创建对象 tool1 = Tool("斧头") tool2 = Tool("榔头") print(Tool.count) # 输出:2,所有对象共享类属性 

2. 类方法:操作类属性的方法

@classmethod装饰,第一个参数是cls(指向类本身),用于操作类属性:

python

运行

class Tool: count = 0 def __init__(self, name): self.name = name Tool.count += 1 # 类方法:通过cls访问类属性 @classmethod def show_count(cls): print(f"已创建{cls.count}个工具对象") Tool("铁锹") Tool.show_count() # 输出:已创建1个工具对象 

3. 静态方法:独立于类和对象的方法

@staticmethod装饰,无需访问类属性或实例属性,相当于类中的普通函数:

python

运行

class Game: # 静态方法:游戏帮助信息 @staticmethod def show_help(): print("游戏操作指南:") print("1. 按1开始游戏 2. 按2暂停 3. 按3退出") # 直接通过类名调用,无需创建对象 Game.show_help() 

五、实战案例:综合运用面向对象特性

案例:烤地瓜模拟器

需求:实现烤地瓜的完整流程,包括烤制时间对应生熟状态、添加调料等功能。

python

运行

class SweetPotato: def __init__(self): # 实例属性:烤制时间、生熟状态、调料列表 self.cook_time = 0 self.cook_state = "生的" self.condiments = [] # 烤制方法 def cook(self, time): self.cook_time += time # 根据时间判断生熟状态 if 0 <= self.cook_time < 3: self.cook_state = "生的" elif 3 <= self.cook_time < 5: self.cook_state = "半生不熟" elif 5 <= self.cook_time < 8: self.cook_state = "熟了" else: self.cook_state = "烤糊了" # 添加调料方法 def add_condiment(self, condiment): self.condiments.append(condiment) # 自定义打印格式 def __str__(self): return f"烤制时间:{self.cook_time}分钟,状态:{self.cook_state},调料:{self.condiments}" # 使用示例 digua = SweetPotato() print(digua) # 初始状态 digua.cook(2) digua.add_condiment("白糖") print(digua) # 烤2分钟后 digua.cook(4) digua.add_condiment("辣椒面") print(digua) # 再烤4分钟后 

六、学习总结与进阶建议

1. 核心知识点梳理

  • 思维层面:从 "步骤导向" 转变为 "对象导向",学会抽象现实事物;
  • 基础层面:掌握类与对象的定义、属性与方法的操作、self 关键字;
  • 特性层面:理解封装(数据安全)、继承(代码复用)、多态(灵活扩展)的核心价值;
  • 高级层面:区分实例成员与类成员,合理使用魔法方法优化类设计。

2. 进阶建议

  1. 多做实战项目:尝试用面向对象思想重构原有代码,比如实现学生管理系统、图书管理系统;
  2. 研究优秀源码:阅读 Python 标准库或第三方框架的源码,学习专业的面向对象设计;
  3. 深入设计模式:面向对象是设计模式的基础,后续可学习单例模式、工厂模式等常用设计模式。

Read more

《Web 自动化测试入门:从概念到百度搜索实战全拆解》

《Web 自动化测试入门:从概念到百度搜索实战全拆解》

一、自动化的核心概念 1. 定义:通过自动方式替代人工操作完成任务,生活中常见案例(自动洒水机、自动洗手液、超市闸机)体现了 “减少人力消耗、提升效率 / 质量” 的特点。 2. 软件自动化测试的核心目的: * 用于回归测试:软件迭代新版本时,验证新增功能是否影响历史功能的正常运行。 3. 常见面试题解析: * 自动化测试不能完全取代人工测试:需人工编写脚本,且功能变更后需维护更新,可靠性未必优于人工。 * 自动化测试不能 “大幅度降低工作量”:仅能 “一定程度” 减少重复工作,需注意表述的严谨性。 二、自动化测试的分类 自动化是统称,包含多种类型,核心分类及说明如下: 分类说明接口自动化针对软件接口的测试,目的是验证接口的功能、性能、稳定性等。UI 自动化 针对软件界面的测试,包含: 1. 移动端自动化:通过模拟器在电脑上编写脚本,测试手机应用;稳定性较差(受设备、

By Ne0inhk

使用Docker安装Ollama及Open-WebUI完整教程

作者:吴业亮 博客:wuyeliang.blog.ZEEKLOG.net 一、Ollama 简介及工作原理 1. Ollama 简介及原理 * 简介:Ollama 是一款轻量级、开源的大语言模型(LLM)运行工具,旨在简化本地部署和运行大语言模型的流程。它支持 Llama 3、Mistral、Gemini 等主流开源模型,用户无需复杂配置即可在本地设备(CPU 或 GPU)上快速启动模型,适用于开发测试、本地智能应用搭建等场景。 * 工作原理: * 采用模型封装机制,将大语言模型的运行环境、依赖库及推理逻辑打包为标准化格式,实现模型的一键下载、启动和版本管理。 * 通过优化的推理引擎适配硬件架构,支持 CPU 基础运行和 GPU 加速(如 NVIDIA CUDA),减少资源占用并提升响应速度。 * 提供简洁的

By Ne0inhk
离开舒适区之后:从三年前端到 CS 硕士——我在韩国亚大读研的得失

离开舒适区之后:从三年前端到 CS 硕士——我在韩国亚大读研的得失

过去一年多,我做了一个挺重要的决定:辞职,去韩国留学读研。 这段时间我几乎没怎么学习新的前端内容,但也没有停下来。我在韩国亚洲大学完成了计算机科学与技术(大数据)硕士的学习,在高强度的节奏里重新建立了自己的方法,也因为持续写博客获得了一些机会,担任本科 Web 实训课讲师。现在这段留学告一段落,我也准备重新回到前端领域,把这段经历当作一份额外的积累带回去。这篇复盘主要是想把这一路的收获、疲惫和一些值得记住的瞬间记录下来,留给未来的自己,也分享给路过的你。 文章目录 * 1、写在前面:我为什么会从前端转去读研 * 2、留学生活的关键词:卷、AI、被看见以及校庆的“放开玩” * 3、我的“结果卡片” * 4、得:这一年半我真正收获的东西 * 5、失:我付出的代价 * 6、期末周:我经历过的“高强度交付周” * 7、前端三年经验,如何在读研里“迁移复用” * 8、我在韩国的学习系统:

By Ne0inhk
前端流程图框架11个:开发组态图、思维导图、拓扑图必备,收藏这篇就够了

前端流程图框架11个:开发组态图、思维导图、拓扑图必备,收藏这篇就够了

一、流程图的前端开发都是如何实现的 在前端开发中,实现流程图通常涉及以下几个方面: 1. HTML 结构:使用 HTML 标签来定义流程图的结构,如使用元素表示节点,使用元素表示连接线等。 2. CSS 样式:使用 CSS 样式来定义流程图的外观,包括节点的样式、连接线的样式、文本的样式等。可以使用 CSS 属性来设置颜色、大小、边框等样式属性。 3. JavaScript 交互:使用 JavaScript 来实现流程图的交互功能,如节点的拖拽、连接线的绘制、文字编辑等。可以使用原生 JavaScript 或者流程图框架提供的 API 来实现这些功能。 1. **数据绑定:**将流程图的数据与界面进行绑定,可以使用 JavaScript 对象或者 JSON 格式来表示流程图的数据结构,并通过 JavaScript

By Ne0inhk