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 提供的基类,可以定义严格的接口契约,强制子类实现某些核心方法。

posted @ 2026-05-10 13:14  RReally  阅读(18)  评论(0)    收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中