python学习笔记——面向对象背景知识
引言:Python 中 “万物皆对象” 的核心思想
在 Python 里,几乎所有东西都是对象,你图里列出的这些都是:
基本数据类型:int、float、str(比如3、"Hello")
容器类型:list、tuple、set、dict(图里写的 Map 对应 Python 的 dict)
函数、迭代器、类实例,甚至函数本身也都是对象。
验证方式就是你图里的type()函数:
>>> type(3)
<class 'int'>
>>> type("Hello")
<class 'str'>
>>> type([1,2])
<class 'list'>
它们都有对应的类(class),本质上都是对应类的实例。
一.类与对象的核心概念
1. 类和对象的关系
类(Class):是对数据和操作的抽象封装,相当于一个 “模板”。
对象(Instance):是类的实例化结果,相当于根据模板造出的具体事物。
2. 类 vs 类型(Type)
类型:描述了数据以及对数据所能做的操作。比如int类型,描述了整数数据,以及加减乘除等操作。
在 Python 中,类就是一种自定义数据类型,和int、str这些内置类型地位是平等的。
类比其他语言:C 语言的结构体、C++ 的类,本质上都是自定义数据类型的实现方式,Python 的类更彻底地实现了这一点。
3. 为什么说 Python 是纯面向对象语言?
因为 Python 中没有脱离对象的东西:
定义一个函数,它本身是function类的实例;
定义一个类,它本身是type类的实例(Python 的元类机制);
甚至模块、异常,也都是对象。
4. 类的本质:封装数据与操作
你可以把类理解为一个 “数据 + 操作” 的打包:
数据:属性(attribute),比如一个Student类里的name、age;
操作:方法(method),比如Student类里的study()、introduce()。
二、抽象与封装解读
1. 抽象(Abstraction)
定义:关注程序实体的外部可观察行为,而忽略内部实现细节。
通俗理解:就像用手机,你只需要知道 “点一下就能打电话”,不需要知道信号如何传输、电路如何工作。
目的:把复杂的东西简化成一组清晰的接口,降低使用和理解的成本。
2. 封装(Encapsulation)
定义:把程序实体的具体实现细节对使用者隐藏起来,只暴露必要的接口。
通俗理解:手机的内部零件被外壳包起来了,你不能随便拆改,只能通过屏幕、按键这些接口操作。
目的:保护数据和实现细节,避免外部随意修改,让代码更安全、更容易维护。
三、面向对象的核心特征解析
1. 对象与封装
核心定义
程序由若干对象组成,每个对象是数据 + 操作的封装体。
通俗理解:
就像一个 “智能盒子”,里面装着数据(属性)和处理数据的方法(函数),外部只能通过方法和它交互,看不到内部细节。
2. 类与实例
-
对象的特征由类来描述:类是对象的 “模板”,对象是类的 “实例”。
-
比如Student类定义了学生都有的属性(姓名、学号)和方法(选课),而具体的 “李明云” 就是这个类的一个对象。
3. 消息传递
class Lmy:
lmy=Lmy(a,b,c)
lmy.f1()#这一步叫做传递消息
再比如 super().f2()这一步也是在传递消息
对数据的使用,是通过向对象发送消息来实现的。
- 通俗理解:调用对象的方法,本质上就是给对象发了一个 “请求”,让它执行对应的操作。比如student.select_course("Python"),就是给student对象发送了 “选 Python 课” 的消息。
4. 继承
一个类的特征可以从其他类继承获得,实现代码复用和扩展。
eg. 比如定义Student类,再定义GraduateStudent类继承它,自动拥有Student的所有属性和方法,还能添加自己的write_thesis()方法
5. 多态
相同消息发送给不同对象,会引发不同的行为,这就是多态。
比如给Student和Teacher对象都发送introduce()消息,学生的介绍会说 “我是 XX 班的学生”,老师的介绍会说 “我是 XX 课程的老师”,同一个方法名,不同对象的实现不同。
python示例代码
# 父类(模板)
class Person:
def __init__(self, name):
self.name = name # attribute
def introduce(self): # 对外暴露的方法(消息接口)
pass
# 子类继承父类
class Student(Person):
def introduce(self):
print(f"我是学生{self.name},来自人工智能25级2班")
class Teacher(Person):
def introduce(self):
print(f"我是老师{self.name},负责Python课程")
# 多态的体现
def send_intro_message(person):
person.introduce() # 给不同对象发送相同消息
s = Student("李明云")
t = Teacher("张老师")
send_intro_message(s) # 输出:我是学生李明云...
send_intro_message(t) # 输出:我是老师张老师...
这段代码同时体现了封装、继承和多态的核心思想。
概括
第一部分:核心概念与基础 (P1-P8)
OOP (面向对象) 的本质
文档强调一切皆对象(整型、字符串、函数等都是对象)。类(Class)是创建对象的模板,定义了对象的属性(数据)和方法(操作)。
抽象与封装
:这是 OOP 的基石。抽象关注外部行为,封装隐藏内部细节。过程式程序设计以过程为核心,而 OOP 以数据为核心。
类定义
:类定义使用 class 关键字。init 函数是构造函数,在创建对象时自动调用,用于初始化属性。self 代表当前对象实例,用于绑定和访问成员变量。
第二部分:对象的使用与状态 (P9-P13)
实例化
:通过调用类(如 Account("Li"))创建对象。每个对象拥有独立的内存空间和独立的属性状态。
成员访问
:通过点表达式(.)访问属性。即使类定义相同,不同实例的变量(如 balance)互不干扰。
第三部分:成员函数与访问控制 (P14-P21)
Bound Method:对象调用成员函数时,Python 会自动传入 self,使函数能访问对象状态。
命名约定:
__xxx__:系统内置标识(如 __init__)。
__xxx:类内私有,限制外部直接访问。
_xxx:习惯上视为内部使用,不建议外部调用。
第四部分:类成员 (Class Attribute) (P22-P27)
类成员 vs 实例成员:
类成员(如 interest)被该类所有对象共享,类似于 C++ 中的 static 变量。
生命周期:
文档提到了 del 方法,用于对象销毁前的清理操作(如计数减一)。
第五部分:继承与多态 (P28-P39)
继承 (is-a)
:派生类继承基类属性。派生类可以通过 super() 或类名调用基类方法。
重写 (Overriding)
:派生类可以重新定义基类的方法以改变行为(如手续费处理)。
多态 (Polymorphism)
:相同的消息(方法调用)发送给不同对象会产生不同行为。isinstance 和 issubclass 是判断类型关系的重要手段。
第六部分:多继承与 MRO (P40-P52)
多继承:Python 允许一个类继承多个基类。
MRO (Method Resolution Order):方法解析顺序,决定了查找成员的优先级。文档重点介绍了 super() 是如何配合 MRO 依次、不重复地调用父类方法的。
第七部分:动态类型与 Duck Typing (P53-P59)
Duck Typing:即“如果它看起来像鸭子,走起来像鸭子,叫声像鸭子,那它就是鸭子”。
关注对象是否具备特定的方法(接口),而非关注其显式类型。
EAFP 风格:
Python 推荐“求原谅比求许可容易”(Easier to Ask Forgiveness than Permission),通过捕获异常处理错误,而非频繁使用 if 检查条件。
第八部分:特殊方法 (Magic Functions) (P60-P65)
魔术方法:如 str, len, add 等,允许用户自定义类对象在进行内置函数调用或运算符运算时的行为。
Callable 对象:通过定义 call,可以让对象像函数一样被调用。
第九部分:类型注解与进阶 (P66-P70)
类型注解:
使用 :type 和 -> type 增加代码的可读性和静态检查支持,但不强制影响运行时行为。
ABC (Abstract Base Classes):
通过 collections.abc 提供的基类,可以定义严格的接口契约,强制子类实现某些核心方法。

浙公网安备 33010602011771号