28. 面向对象基础
28.1 类和对象
- 讲解:Python 是面向对象语言,类是对象的模板,对象是类的实例。
# 定义类 class Student: def __init__(self, name, age): self.name = name self.age = age def show(self): print(f"姓名:{self.name}, 年龄:{self.age}") # 创建对象 stu1 = Student("小明", 18) stu1.show()- 关键点总结
class定义类__init__构造方法,用于初始化属性self表示对象本身- 对象通过类创建,调用方法使用
对象.方法()
28.2 类属性与实例属性
- 讲解:类属性是所有实例共享的,实例属性属于各自对象。
class Dog: kind = "狗" # 类属性 def __init__(self, name): self.name = name # 实例属性 dog1 = Dog("旺财") dog2 = Dog("小黑") print(dog1.kind, dog1.name) print(dog2.kind, dog2.name) # 修改类属性 Dog.kind = "宠物狗" print(dog1.kind, dog2.kind)- 关键点总结
- 类属性用类名访问或实例访问
- 实例属性只能通过对象访问
- 修改类属性会影响所有实例
28.3 方法类型
- 讲解:Python 类中方法有三种:实例方法、类方法、静态方法
class Demo: count = 0 # 类属性 def __init__(self, name): self.name = name def instance_method(self): print(f"实例方法:{self.name}") @classmethod def class_method(cls): print(f"类方法:{cls.count}") @staticmethod def static_method(): print("静态方法,不访问类或实例属性") d = Demo("测试") d.instance_method() Demo.class_method() Demo.static_method()- 关键点总结
- 实例方法:访问对象属性
- 类方法:访问类属性,用
@classmethod - 静态方法:不访问实例或类,用
@staticmethod
28.4 继承与多态
- 讲解:子类继承父类属性和方法,可重写方法实现多态
class Animal: def speak(self): print("动物叫声") class Dog(Animal): def speak(self): print("汪汪汪") class Cat(Animal): def speak(self): print("喵喵喵") animals = [Dog(), Cat()] for a in animals: a.speak() # 多态:同名方法不同表现- 关键点总结
- 子类通过
(父类)继承 - 方法重写实现多态
- Python 支持多继承
- 子类通过
28.5 封装与私有属性
- 讲解:通过
_或__前缀实现属性和方法封装
class Person: def __init__(self, name, age): self.__name = name # 私有属性 self._age = age # 受保护属性 def show(self): print(f"姓名:{self.__name}, 年龄:{self._age}") p = Person("小红", 20) p.show() # print(p.__name) # 报错,私有属性不能直接访问 print(p._age) # 可以访问,但约定不直接使用- 关键点总结
_变量:受保护,不建议外部访问__变量:私有属性,外部不能直接访问- 封装保证对象内部数据安全
29. 模块与包
29.1 模块概念
- 讲解:模块是 Python 的文件,里面可以包含函数、类、变量。通过模块可以实现代码复用和组织。
# 假设有一个模块 math_utils.py def add(a, b): return a + b def sub(a, b): return a - b- 关键点总结
- 每个
.py文件都是模块 - 模块名即文件名,不含
.py - 可以在其他文件中
import使用模块功能
- 每个
29.2 导入模块
- 讲解:使用
import或from ... import ...导入模块。
# 导入整个模块 import math_utils print(math_utils.add(10, 5)) print(math_utils.sub(10, 5)) # 从模块导入指定函数 from math_utils import add print(add(20, 10)) # 导入时重命名 import math_utils as mu print(mu.add(1, 2))- 关键点总结
import 模块名导入整个模块from 模块名 import 函数名导入指定功能as可给模块或函数起别名
29.3 包的概念
- 讲解:包是包含多个模块的目录,目录下需有
__init__.py文件。
project/ ├── mypackage/ │ ├── __init__.py │ ├── mod1.py │ └── mod2.py └── main.py- 关键点总结
- 包 = 目录 +
__init__.py - 可以组织大量模块
__init__.py可为空,也可执行包初始化代码
- 包 = 目录 +
29.4 导入包中的模块
- 讲解:使用点号
.导入包内模块
# main.py from mypackage import mod1 mod1.func1() # 或者 from mypackage.mod2 import func2 func2()- 关键点总结
包名.模块名导入模块from 包名.模块名 import 函数/类导入指定内容- 避免循环导入
29.5 Python 标准库
- 讲解:Python 自带丰富模块,无需安装,如
os、sys、math、datetime等
import os print(os.getcwd()) # 当前工作目录 import sys print(sys.version) # Python 版本 import math print(math.sqrt(16)) # 开平方 from datetime import datetime print(datetime.now())- 关键点总结
- 标准库模块无需安装
- 可快速处理文件、系统、数学、时间等功能
- 避免重复造轮子,提高开发效率
29.6 自定义模块建议
- 讲解
- 模块命名尽量简洁
- 功能单一,便于维护
- 提供文档字符串,方便其他人使用
""" math_utils 模块示例 提供加减乘除基本运算函数 """ def add(a, b): return a + b- 关键点总结
- 保持模块高内聚、低耦合
- 使用文档字符串记录功能
- 模块放在项目统一路径或 Python 搜索路径中
30. Python 标准库常用模块
30.1 os 模块
- 讲解:
os模块用于操作系统相关功能,如文件路径、目录管理等。
import os # 当前工作目录 print(os.getcwd()) # 列出当前目录文件和文件夹 print(os.listdir('.')) # 创建文件夹 os.mkdir('test_dir') # 重命名文件夹 os.rename('test_dir', 'demo_dir') # 删除文件夹 os.rmdir('demo_dir')- 关键点总结
os.getcwd()获取当前目录os.listdir()列出目录内容os.mkdir()/os.rmdir()创建/删除文件夹os.rename()重命名文件或文件夹
30.2 sys 模块
- 讲解:
sys模块提供与 Python 解释器交互的功能。
import sys # Python 版本 print(sys.version) # 命令行参数 print(sys.argv) # 退出程序 # sys.exit()- 关键点总结
sys.version查看 Python 版本sys.argv获取命令行参数列表sys.exit()退出程序
30.3 math 模块
- 讲解:
math提供常用数学函数,如开方、三角函数、对数等。
import math print(math.sqrt(16)) # 4.0 print(math.pow(2, 3)) # 8.0 print(math.sin(math.pi/2)) # 1.0 print(math.ceil(3.2)) # 4 向上取整 print(math.floor(3.8)) # 3 向下取整- 关键点总结
- 常用函数:
sqrt,pow,sin,cos,ceil,floor - 适合科学计算和数学操作
- 常用函数:
30.4 datetime 模块
- 讲解:
datetime模块处理日期和时间。
from datetime import datetime, date, timedelta # 当前时间 now = datetime.now() print(now) # 当前日期 today = date.today() print(today) # 日期运算 tomorrow = today + timedelta(days=1) print(tomorrow)- 关键点总结
datetime.now()获取当前时间date.today()获取当前日期timedelta做日期加减运算
30.5 random 模块
- 讲解:
random用于生成随机数和随机选择。
import random print(random.random()) # 0-1 随机浮点数 print(random.randint(1, 10)) # 1-10 随机整数 print(random.choice([1,2,3,4,5])) # 随机选择列表元素 print(random.sample([1,2,3,4,5], 3)) # 随机取 3 个元素- 关键点总结
random()生成 0-1 浮点数randint(a, b)生成 a-b 整数choice从序列随机选一个sample从序列随机选多个
30.6 collections 模块
- 讲解:
collections提供高效容器类型,如Counter,deque,defaultdict等。
from collections import Counter, deque, defaultdict # Counter 计数器 words = ['apple', 'banana', 'apple', 'orange'] cnt = Counter(words) print(cnt) # deque 双端队列 dq = deque([1,2,3]) dq.append(4) dq.appendleft(0) print(dq) # defaultdict dd = defaultdict(int) dd['a'] += 1 print(dd)- 关键点总结
Counter统计元素出现次数deque双端队列,支持两端快速操作defaultdict自动初始化字典值
31. 面向对象进阶
31.1 类方法与静态方法复习
讲解
:
- 实例方法:访问实例属性
- 类方法:访问类属性或方法,用
@classmethod - 静态方法:不访问类或实例属性,用
@staticmethod
class Demo: count = 0 # 类属性 def __init__(self, name): self.name = name def instance_method(self): print(f"实例方法: {self.name}") @classmethod def class_method(cls): print(f"类方法: {cls.count}") @staticmethod def static_method(): print("静态方法: 无需访问实例或类") d = Demo("测试") d.instance_method() Demo.class_method() Demo.static_method()- 关键点总结
- 实例方法访问对象属性
- 类方法访问类属性
- 静态方法独立,常用于工具函数
31.2 属性装饰器@property
- 讲解:
@property用于将方法变为属性访问,便于封装和控制。
class Person: def __init__(self, name): self._name = name @property def name(self): print("访问属性") return self._name @name.setter def name(self, value): print("设置属性") self._name = value p = Person("小明") print(p.name) # 访问属性,调用 getter p.name = "小红" # 调用 setter print(p.name)- 关键点总结
@property将方法伪装为属性@setter设置属性值- 封装数据,控制访问和修改逻辑
31.3 生成器yield
- 讲解:生成器可以按需生成数据,节省内存,适合大数据处理。
# 普通函数返回列表 def func_list(n): return [i for i in range(n)] print(func_list(5)) # 生成器函数 def func_gen(n): for i in range(n): yield i for x in func_gen(5): print(x)- 关键点总结
yield每次返回一个值,保留函数状态for循环或next()遍历生成器- 内存效率高,适合处理大数据
31.4 迭代器
- 讲解:迭代器对象遵循
__iter__和__next__协议,可以被for循环遍历。
# 自定义迭代器 class MyIterator: def __init__(self, n): self.i = 0 self.n = n def __iter__(self): return self def __next__(self): if self.i < self.n: val = self.i self.i += 1 return val else: raise StopIteration it = MyIterator(5) for x in it: print(x)- 关键点总结
__iter__()返回迭代器对象__next__()返回下一个元素,结束时抛出StopIteration- 生成器是迭代器的一种简化写法
31.5 装饰器@
- 讲解:装饰器用于在不修改函数代码的情况下增加功能。
def decorator(func): def wrapper(*args, **kwargs): print("开始执行函数") result = func(*args, **kwargs) print("函数执行结束") return result return wrapper @decorator def greet(name): print(f"Hello, {name}") greet("小明")- 关键点总结
@decorator等价于greet = decorator(greet)- 装饰器常用于日志、权限检查、性能统计
- 可装饰函数或类方法