一、编程范式:面向过程与面向对象的哲学之争
1.1 面向过程编程(Procedural Programming)
核心思想:将程序视为一系列线性执行的指令集合,以函数为基本组织单元,通过函数调用的顺序逻辑实现功能。典型特征包括:
- 线性流程:代码按预设顺序逐步执行
- 函数中心:通过函数拆分实现代码复用
- 数据分离:数据与操作分离,数据通过参数传递
# 面向过程示例:学生成绩处理
def calculate_avg(scores):
return sum(scores)/len(scores)
student = {'name': '张三', 'scores': [85, 92, 78]}
print(f"{student['name']}的平均分:{calculate_avg(student['scores'])}")
1.2 面向对象编程(Object-Oriented Programming)
核心思想:以对象为程序基本单元,每个对象包含数据(属性)和操作(方法),通过对象间的交互实现功能。关键特性:
- 封装:数据与操作封装在对象内部
- 继承:通过继承实现代码复用与扩展
- 多态:不同对象对同一消息的差异化响应
# 面向对象示例:学生类
class Student:
def __init__(self, name, scores):
self.name = name
self.scores = scores
def calculate_avg(self):
return sum(self.scores)/len(self.scores)
student = Student("张三", [85, 92, 78])
print(f"{student.name}的平均分:{student.calculate_avg()}")
1.3 范式对比与选型原则
维度 | 面向过程 | 面向对象 |
---|---|---|
适用场景 | 简单任务、算法实现 | 复杂系统、模块化开发 |
代码组织 | 函数模块化 | 类/对象封装 |
数据管理 | 参数传递 | 对象内部维护 |
扩展性 | 修改成本高 | 继承/组合灵活扩展 |
典型应用 | 数学计算、脚本工具 | GUI开发、业务系统 |
选型建议:小型项目优先面向过程,复杂系统采用面向对象。实际开发中常混合使用
二、类与对象:面向对象的基石
2.1 类(Class)的定义与实例化
类的定义遵循大驼峰命名法,使用class
关键字创建模板蓝图:
class Student:
# 类属性(所有实例共享)
school = "清华大学"
def __init__(self, name, age):
# 实例属性初始化
self.name = name
self.age = age
# 实例方法
def study(self, course):
print(f"{self.name}正在学习{course}")
实例化过程解析:
stu1 = Student("李四", 20) # 调用__init__初始化
print(stu1.__dict__) # 查看实例属性字典
# 输出:{'name': '李四', 'age': 20}
2.2 方法类型详解
2.2.1 实例方法
- 第一个参数为
self
(实例引用) - 通过实例访问属性/方法
stu1.study("Python") # 李四正在学习Python
2.2.2 类方法
- 使用
@classmethod
装饰器 - 第一个参数为
cls
(类引用) - 操作类级别属性/行为
@classmethod
def change_school(cls, new_school):
cls.school = new_school
2.2.3 静态方法
- 使用
@staticmethod
装饰器 - 无默认参数,工具函数性质
@staticmethod
def show_rules():
print("学生守则:...")
2.3 属性访问控制
类型 | 声明方式 | 访问权限 |
---|---|---|
公有属性 | self.attr | 完全开放 |
受保护属性 | _attr(单下划线) | 约定私有 |
私有属性 | __attr(双下划线) | 类内访问 |
class Account:
def __init__(self, balance):
self.__balance = balance # 私有属性
def get_balance(self): # 访问器方法
return self.__balance
三、高级特性与实战技巧
3.1 动态绑定机制
Python支持运行时动态添加属性/方法,提升灵活性:
stu1.gender = "男" # 动态添加属性
# 动态绑定方法
from types import MethodType
def set_score(self, score):
self.score = score
stu1.set_score = MethodType(set_score, stu1)
注意:动态绑定仅影响当前实例,使用
__slots__
可限制动态属性以优化内存
3.2 属性装饰器
通过@property
实现属性访问控制:
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def fahrenheit(self):
return self._celsius * 1.8 + 32
@fahrenheit.setter
def fahrenheit(self, value):
self._celsius = (value - 32) / 1.8
3.3 对象生命周期管理
__new__
:控制实例创建过程__del__
:定义对象销毁行为
class Singleton:
_instance = None
def __new__(cls, *args):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
四、面向对象设计原则
- 单一职责原则:一个类只做一件事
- 开放封闭原则:对扩展开放,对修改关闭
- 里氏替换原则:子类可替换父类
- 接口隔离原则:客户端不应依赖不需要的接口
- 依赖倒置原则:高层模块不依赖底层细节
五、最佳实践建议
类结构设计:
- 优先组合而非继承
- 控制类层级深度(建议不超过3层)
- 合理使用抽象基类(ABC)
性能优化:
- 对大量实例使用
__slots__
- 避免在
__init__
中执行耗时操作 - 使用weakref处理循环引用
- 对大量实例使用
调试技巧:
print(vars(obj)) # 查看对象属性 import inspect inspect.getmembers(obj) # 获取成员列表
推荐阅读:
- 《Python高级编程(第3版)》
- 《流畅的Python》
- 《设计模式:可复用面向对软件的基础》
最新技术动态请关注作者:Python×CATIA工业智造
版权声明:转载请保留原文链接及作者信息