一、前言
在 Python 学习过程中,面向对象编程(Object Oriented Programming,简称 OOP)是一个非常重要的知识点。
Python 不仅支持面向过程编程,也支持面向对象编程。对于简单的小程序,我们可以使用函数快速完成任务;但是当项目规模扩大,代码越来越复杂时,面向对象思想能够帮助我们更好地组织代码,提高程序的复用性和维护性。
本文将详细介绍 Python 面向对象编程中的核心知识:
- 什么是面向对象
- 类和对象的关系
- 如何创建类和对象
self的作用- 属性和方法的区别
- 类方法、静态方法
- 动态添加属性和方法
二、面向过程 VS 面向对象
Python 是一种支持多种编程范式的语言,既可以采用面向过程,也可以采用面向对象方式开发。
1. 面向过程编程
面向过程(Procedural Programming)是一种以过程为核心的编程思想。
它关注:
完成一个任务需要哪些步骤,然后按照步骤执行。
例如:
实现“把大象装进冰箱”:
1def open_door(): 2 print("打开冰箱门") 3 4 5def put_elephant(): 6 print("把大象装进去") 7 8 9def close_door(): 10 print("关闭冰箱门") 11 12 13open_door() 14put_elephant() 15close_door() 16
这种写法比较直观。
但是如果需求变复杂:
- 不同品牌冰箱
- 不同容量冰箱
- 多个冰箱对象
代码会越来越混乱。
2. 面向对象编程
面向对象(Object Oriented Programming)关注的是:
程序中有哪些对象,以及对象之间如何交互。
例如:
冰箱就是一个对象。
我们可以定义一个冰箱类:
1class IceBox: 2 3 def __init__(self, brand): 4 self.brand = brand 5 self.door_open = False 6 7 8 def open_door(self): 9 self.door_open = True 10 print("冰箱门打开") 11 12 13 def put_elephant(self, food): 14 if self.door_open: 15 print(f"{food}放入冰箱") 16 else: 17 print("请先打开冰箱") 18 19 20 def close_door(self): 21 self.door_open = False 22 print("冰箱门关闭") 23 24 25box = IceBox("小米") 26 27box.open_door() 28box.put_elephant("大象") 29box.close_door() 30
相比面向过程:
- 数据和操作进行了封装
- 代码结构更加清晰
- 更方便扩展
这就是面向对象中的重要思想:
封装
三、类和对象
类和对象是面向对象编程最核心的两个概念。
1. 类(Class)
类是对一类事物的抽象。
例如:
现实世界:
1学生 2
抽象成程序:
1class Student: 2 pass 3
类描述:
- 对象有什么属性
- 对象有什么行为
例如:
学生:
属性:
1姓名 2年龄 3学号 4
方法:
1学习 2考试 3休息 4
类就是创建对象的模板。
2. 对象(Object)
对象是类创建出来的具体实例。
例如:
类:
1学生 2
对象:
1张三 2李四 3王五 4
代码:
1class Student: 2 pass 3 4 5s1 = Student() 6s2 = Student() 7
这里:
Student
是类。
s1
和
s2
是对象。
对象具有:
- 属性
- 方法
- 唯一标识
四、Python如何定义类
基本语法
1class 类名: 2 3 类体 4
例如:
1class Person: 2 3 pass 4
Python 中类名通常使用:
大驼峰命名法
例如:
1StudentInfo 2 3UserAccount 4 5CarFactory 6
五、init 初始化方法
__init__() 是 Python 中非常重要的方法。
作用:
创建对象后自动执行,用于初始化对象数据。
例如:
1class Person: 2 3 def __init__(self,name): 4 5 self.name = name 6 7 8p = Person("张三") 9 10print(p.name) 11
输出:
1张三 2
创建对象:
1Person("张三") 2
会自动执行:
1__init__() 2
六、self到底是什么?
很多 Python 初学者都会疑惑:
为什么方法里面必须写 self?
例如:
1class Person: 2 3 def eat(self): 4 print("吃饭") 5
这里:
self
代表:
当前对象本身
例如:
1p = Person() 2 3p.eat() 4
实际上等价于:
1Person.eat(p) 2
调用实例方法时,对象会自动作为第一个参数传入。
七、类属性和实例属性
Python 中属性分为:
- 类属性
- 实例属性
1. 类属性
类属性:
定义在类里面,方法外面。
例如:
1class Person: 2 3 country="China" 4
访问:
1print(Person.country) 2
所有对象共享。
例如:
1p1=Person() 2p2=Person() 3 4print(p1.country) 5print(p2.country) 6
输出:
1China 2China 3
2. 实例属性
实例属性属于对象自己。
通过:
1self.xxx 2
定义。
例如:
1class Person: 2 3 def __init__(self,name,age): 4 5 self.name=name 6 self.age=age 7
创建:
1p1=Person("张三",18) 2 3p2=Person("李四",20) 4
两个对象拥有不同的数据。
八、Python中的三种方法
Python 类中主要有:
- 实例方法
- 类方法
- 静态方法
1. 实例方法
特点:
- 第一个参数是 self
- 可以访问实例属性
1class Person: 2 3 4 def eat(self): 5 6 print("吃饭") 7 8 9p=Person() 10 11p.eat() 12
2. 类方法
使用:
1@classmethod 2
第一个参数:
1cls 2
示例:
1class Person: 2 3 country="China" 4 5 6 @classmethod 7 def show(cls): 8 9 print(cls.country) 10 11 12Person.show() 13
3. 静态方法
使用:
1@staticmethod 2
特点:
- 不访问实例属性
- 不访问类属性
例如工具函数:
1class Math: 2 3 4 @staticmethod 5 def add(a,b): 6 7 return a+b 8 9 10print(Math.add(1,2)) 11
九、特殊方法(魔法方法)
Python 中:
双下划线开头和结尾的方法:
称为:
魔法方法
例如:
init
初始化对象
str
控制 print 输出
repr
控制解释器显示
del
对象销毁
例如:
1class Person: 2 3 4 def __str__(self): 5 6 return "Person对象" 7
十、动态添加属性和方法
Python 是动态语言。
对象创建后,也可以动态增加内容。
添加对象属性
1class Person: 2 3 pass 4 5 6p=Person() 7 8 9p.name="张三" 10 11print(p.name) 12
添加类属性
1Person.age=18 2
动态添加方法
需要使用:
1types.MethodType 2
例如:
1import types 2 3 4def eat(self): 5 6 print("吃饭") 7 8 9p.eat=types.MethodType(eat,p) 10 11 12p.eat() 13
十一、__slots__限制属性
默认情况下:
Python 对象可以随意添加属性。
例如:
1p.age=18 2 3p.height=180 4
但是有时候我们希望限制属性。
可以使用:
1__slots__ 2
例如:
1class Person: 2 3 __slots__=("name","age") 4
这样:
允许:
1p.name="张三" 2 3p.age=18 4
禁止:
1p.weight=70 2
十二、总结
本文详细介绍了 Python 面向对象编程的重要知识:
| 知识点 | 说明 |
|---|---|
| 类 | 对象的模板 |
| 对象 | 类创建出来的实例 |
| self | 当前对象本身 |
| init | 初始化方法 |
| 类属性 | 所有对象共享 |
| 实例属性 | 对象独有 |
| 实例方法 | 操作对象 |
| 类方法 | 操作类 |
| 静态方法 | 工具函数 |
| 魔法方法 | 特殊行为控制 |
| 动态属性 | 运行时添加 |
| slots | 限制属性 |
掌握面向对象,是学习 Python 高级开发的重要基础。
后续学习:
- 继承
- 多态
- 封装
- 抽象类
- 设计模式
都会建立在这些基础知识之上。
《Python 面向对象编程详解:从类与对象到动态属性方法》 是转载文章,点击查看原文。
