Python 面向对象编程入门:从思想到属性操作
目录
一、从 “步骤” 到 “实体”:面向对象编程思想的诞生
1. 面向过程:按 “步骤” 拆解问题
2. 面向对象:以 “实体” 为中心组织逻辑
3. 两种思想的对比
二、类与对象:面向对象的核心概念
1. 对象:现实实体的代码映射
2. 类:对象的 “模板”
3. 类的定义与实例化
4. self 关键字:对象的 “身份证”
三、对象的属性:添加与获取的两种方式
1. 类外添加与获取属性
2. 类内获取外部定义的属性
3. 为什么需要__init__方法?
总结:从思想到实践的第一步
在编程世界里,解决问题的思路往往决定了代码的效率与可维护性。面向对象编程(OOP)作为一种贴近现实世界的思维方式,已成为开发复杂系统的核心思想。本文将从编程思想对比出发,带你走进 Python 面向对象的世界,掌握类、对象、属性等核心概念,为后续深入学习打下基础。
一、从 “步骤” 到 “实体”:面向对象编程思想的诞生
编程的本质是解决问题,但不同的思维方式会导致截然不同的代码结构。在面向对象出现之前,“面向过程” 是主流思路,而面向对象的出现,则让代码更贴近现实逻辑。
1. 面向过程:按 “步骤” 拆解问题
面向过程的核心思想可以概括为 “自顶向下,逐步细化”:将一个功能拆解为一系列连续的步骤,每个步骤用函数实现,最终按顺序执行所有步骤完成任务。
举个例子,新学生入学报名的过程,用面向过程的思路会拆解为:
- 学生提出报名,提供材料;
- 学生缴纳学费,获得凭证;
- 教师凭凭证分配班级;
- 班级添加学生信息。
每个步骤对应一个函数,依次调用即可完成整个流程。这种方式直观简单,但当系统复杂到一定程度(比如增加退费、转班等功能),步骤间的耦合会越来越强,修改一处可能引发连锁反应。
2. 面向对象:以 “实体” 为中心组织逻辑
现实世界中,任何动作都有 “执行者”(实体)。面向对象的核心就是围绕这些实体(对象)及其功能来组织代码,让计算机模拟现实逻辑时更自然。
还是以报名系统为例,用面向对象的思路分析:
(1)动作的执行者(实体)有:学生、学校、教师、班级;
(2)每个实体有自己的属性(如学生的姓名、年龄)和功能(如学生缴费、教师分配班级);
(3)最终通过实体间的交互完成整个流程。
这种方式将 “谁来做” 和 “做什么” 分离,让代码结构更清晰,尤其适合大型复杂系统。
3. 两种思想的对比
维度 | 面向过程 | 面向对象 |
---|---|---|
核心 | 步骤与函数 | 实体(对象)与方法 |
模块化 | 函数级模块化 | 类级模块化(封装性更强) |
适用场景 | 简单脚本、步骤固定的功能 | 大型系统、需求多变的场景 |
执行效率 | 较高(函数调用开销小) | 略低(对象实例化有额外开销) |
维护与扩展 | 复杂(步骤耦合度高) | 简单(实体独立,修改影响小) |
二、类与对象:面向对象的核心概念
理解了思想,接下来需要掌握面向对象的 “语法工具”—— 类与对象。
1. 对象:现实实体的代码映射
对象是面向对象编程的基本单元,对应现实世界中的一个具体实体。它由两部分组成:
(1)属性:实体的特征(如人的姓名、年龄,车的品牌、颜色);
(2)方法:实体的功能(如人会吃饭、车能行驶)。
例如,“学生” 对象可以有name(姓名)、age(年龄)等属性,以及study()(学习)、pay_fee()(缴费)等方法。
2. 类:对象的 “模板”
现实中,同一类实体(如所有学生)有相似的属性和方法。类就是对这些相似实体的抽象,规定了对象应该有哪些属性和方法。
简单说:类是模板,对象是模板实例化的产物。比如 “学生类” 规定了所有学生都有姓名和年龄,能学习和缴费;而 “张三”“李四” 就是学生类实例化出的具体对象。
3. 类的定义与实例化
在 Python 中,定义类的语法如下(Python3 推荐使用新式类,继承自object):
# 定义一个学生类(新式类)
class Student(object):# 属性(可以在实例化后添加,也可通过魔术方法初始化)# 方法(函数)def study(self):print(f"{self.name}正在学习") # self的作用见下文def pay_fee(self):print(f"{self.name}缴纳了学费")
类定义后,通过类名()即可实例化对象(无需new关键字):
# 实例化两个学生对象
stu1 = Student()
stu2 = Student()# 为对象添加属性(类外添加方式,下文会详解)
stu1.name = "张三"
stu2.name = "李四"# 调用对象的方法
stu1.study() # 输出:张三正在学习
stu2.pay_fee() # 输出:李四缴纳了学费
4. self 关键字:对象的 “身份证”
在类的方法中,第一个参数必须是self(名称约定为 self,不可省略),它指向当前实例化的对象本身。
例如,当调用stu1.study()时,self就代表stu1;调用stu2.study()时,self就代表stu2。通过self,方法可以访问当前对象的属性和其他方法。
三、对象的属性:添加与获取的两种方式
属性是对象的 “数据”,在 Python 中,属性可以在类外或类内添加和获取,灵活且方便。
1. 类外添加与获取属性
最直接的方式是在实例化对象后,通过对象.属性名添加和获取:
# 定义一个空类
class Person(object):pass# 实例化对象
p = Person()# 类外添加属性
p.name = "王五" # 添加姓名属性
p.age = 20 # 添加年龄属性# 类外获取属性
print(p.name) # 输出:王五
print(p.age) # 输出:20
这种方式简单直观,但每次实例化都要手动添加属性,不够高效(后续会通过__init__方法解决)。
2. 类内获取外部定义的属性
如果属性在类外添加,类内的方法可以通过self.属性名访问:
class Person(object):def introduce(self):# 访问类外添加的name和age属性print(f"我叫{self.name},今年{self.age}岁")p = Person()
p.name = "赵六"
p.age = 25
p.introduce() # 输出:我叫赵六,今年25岁
3. 为什么需要__init__
方法?
当对象需要多个属性时,手动添加不仅繁琐,还可能遗漏。__init__方法(初始化方法)可以在实例化对象时自动初始化属性,解决这一问题。
例如:
class Person(object):# 初始化方法:实例化时自动调用def __init__(self, name, age):self.name = name # 初始化name属性self.age = age # 初始化age属性def introduce(self):print(f"我叫{self.name},今年{self.age}岁")# 实例化时直接传入属性值
p = Person("孙七", 30)
p.introduce() # 输出:我叫孙七,今年30岁
__init__是面向对象中重要的 “魔术方法”,后续会详细讲解。
总结:从思想到实践的第一步
面向对象编程的核心是 “以实体为中心”,通过类与对象的封装,让代码更贴近现实逻辑。本文介绍了:
(1)面向对象与面向过程的思想差异;
(2)类(模板)与对象(实例)的关系;
(3)属性的添加与获取方式。