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