Python 3.12 OOP - Overview
第一章:面向对象编程基础
1.1 类与对象的基本概念
1.2 属性与方法
1.3 构造函数__init__与析构函数__del__
1.4 实例属性与类属性
1.5 方法的类型:实例方法、类方法、静态方法
1.6 访问控制与名称修饰(Name Mangling)
第二章:继承与多态
2.1 单继承与多重继承
2.2 方法重写(Override)与super()
2.3 方法解析顺序(MRO)
2.4 抽象基类(ABC)与abc模块
2.5 鸭子类型与协议(Protocols)
第三章:特殊方法(魔术方法)与运算符重载
3.1 对象创建与销毁:__new__、__init__、__del__
3.2 字符串表示:__str__、__repr__、__format__
3.3 容器模拟:__len__、__getitem__、__setitem__、__delitem__、__contains__
3.4 属性访问控制:__getattr__、__setattr__、__delattr__、__getattribute__
3.5 可调用对象:__call__
3.6 比较运算符:__eq__、__lt__、__le__、__gt__、__ge__、__ne__
3.7 算术运算符:__add__、__sub__、__mul__、__truediv__等及其反向、增量版本
3.8 类型转换:__int__、__float__、__bool__、__bytes__、__complex__、__index__
3.9 上下文管理器:__enter__、__exit__
3.10 可迭代与迭代器:__iter__、__next__
3.11 描述符协议:__get__、__set__、__delete__、__set_name__
3.12 其他特殊方法:__hash__、__dir__、__slots__等
第四章:描述符(Descriptor)
4.1 描述符协议详解
4.2 数据描述符与非数据描述符
4.3 内置描述符:property、staticmethod、classmethod
4.4 自定义描述符与应用(类型检查、惰性计算)
4.5 描述符与__slots__的协同
第五章:元类(Metaclass)
5.1 什么是元类?类也是对象
5.2type元类与动态创建类
5.3 自定义元类:__new__、__init__、__call__
5.4 元类与类装饰器的对比
5.5 常见元类应用:单例、注册子类、ORM 框架
第六章:数据类(dataclasses)
6.1 为什么需要数据类?
6.2@dataclass装饰器与参数详解
6.3 字段(Field)的配置:default、default_factory、init、repr等
6.4 继承与数据类
6.5 数据类与不可变性(frozen=True)
第七章:枚举(enum)
7.1 枚举的基本使用
7.2 自动值与auto()
7.3 枚举的成员与迭代
7.4 功能性扩展与Enum的高级用法
第八章:协议(Protocols)与类型化的鸭子类型
8.1 静态鸭子类型与typing.Protocol
8.2 运行时协议实现
8.3 与抽象基类的区别
第九章:面向对象设计模式与 Python 实践
9.1 单例模式(多种实现)
9.2 工厂模式(简单工厂、工厂方法、抽象工厂)
9.3 观察者模式
9.4 策略模式
9.5 装饰器模式(与语言装饰器的区别)
第十章:Python 3.12 中面向对象的新特性(与 3.11 对比)
10.1 模式匹配(match/case)与对象解构
10.2 泛型类型别名(type语句)
10.3 更友好的错误信息与调试支持
10.4 性能优化在面向对象层面的体现
第一章:面向对象编程基础
1.1 类与对象的基本概念
面向对象编程(OOP)是一种程序设计范式,它将数据和操作数据的方法封装在一起,形成“对象”。在 Python 中,一切皆对象:整数、字符串、列表甚至函数都是对象。类(class)是创建对象的蓝图,定义了一组属性和方法;对象(object)是类的实例。
定义类:
classDog:pass创建对象:
my_dog=Dog()类使用class关键字定义,通常遵循首字母大写的命名惯例。
1.2 属性与方法
属性是对象的数据,方法是对象可以执行的操作。
classDog:def__init__(self,name,age):self.name=name# 实例属性self.age=agedefbark(self):# 实例方法print(f"{self.name}says Woof!")d=Dog("Buddy",3)d.bark()# Buddy says Woof!1.3 构造函数__init__与析构函数__del__
__init__是初始化方法,在对象创建后立即调用,用于设置初始状态。__del__是析构方法,在对象被垃圾回收前调用,用于清理资源,但由于调用时机不确定,不推荐依赖它。
classFileHandler:def__init__(self,filename):self.file=open(filename,'r')def__del__(self):self.file.close()更推荐使用上下文管理器(with)进行资源管理。
1.4 实例属性与类属性
- 实例属性:通过
self绑定,每个实例独立。 - 类属性:直接在类体中定义,所有实例共享。
classStudent:school="MIT"# 类属性def__init__(self,name):self.name=name# 实例属性s1=Student("Alice")s2=Student("Bob")print(s1.school)# MITStudent.school="Harvard"print(s2.school)# Harvard1.5 方法的类型:实例方法、类方法、静态方法
- 实例方法:第一个参数
self,绑定到实例。 - 类方法:使用
@classmethod,第一个参数cls,绑定到类。 - 静态方法:使用
@staticmethod,没有特殊参数,本质是普通函数。
classCalculator:@classmethoddefunit(cls):returncls.__name__@staticmethoddefadd(a,b):returna+b1.6 访问控制与名称修饰
Python 没有严格的私有成员,但约定使用单下划线_表示“保护”,双下划线__触发名称修饰(name mangling),避免子类意外覆盖。
classMyClass:def__init__(self):self._protected=1# 保护成员(约定)self.__private=2# 名称修饰为 _MyClass__privateobj=MyClass()print(obj._protected)# 仍可访问# print(obj.__private) # AttributeErrorprint(obj._MyClass__private)# 2名称修饰主要用于避免继承时的方法名冲突,并不提供真正的安全性。 接下来,会继续介绍面向对象的继承与多态。
如果在学习过程中遇到问题,欢迎在评论区留言讨论!