1. 面向对象编程基础认知
第一次接触面向对象编程(OOP)时,我完全被那些"类"、"对象"、"继承"之类的术语搞晕了。直到自己动手写了几个实际项目后,才真正理解为什么Python要采用这种编程范式。面向对象不是语法糖,而是一种思维方式——把现实世界的事物抽象成代码中的类和对象。
在Python中,一切皆对象。当你写a = 5时,5其实是一个整数类的实例;当你定义函数时,函数本身也是函数类的实例。这种设计让Python的面向对象特性非常自然。三大特性(封装、继承、多态)不是孤立存在的,它们共同构成了面向对象编程的基石。理解这些特性,能让你写出更模块化、更易维护的代码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 封装:隐藏复杂性的艺术
2.1 封装的基本实现
封装是OOP最基础也最重要的特性。它就像给你的代码穿上衣服——只暴露必要的接口,隐藏内部实现细节。在Python中,我们通过类来实现封装:
python复制class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.__balance = balance # 双下划线表示私有属性
def deposit(self, amount):
if amount > 0:
self.__balance += amount
return True
return False
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
return True
return False
def get_balance(self):
return self.__balance
这个银行账户类隐藏了余额的具体存储方式(__balance),只通过deposit、withdraw等方法与外界交互。即使以后要修改内部实现(比如把余额存到数据库),外部代码也不需要改动。
2.2 Python的私有化机制
Python没有真正的私有变量,那双下划线是怎么回事?其实这只是一种名称改写(name mangling):
python复制>>> account = BankAccount("Alice")
>>> account.__dict__
{'_BankAccount__balance': 0, 'owner': 'Alice'}
双下划线前缀的属性会被改为_类名__属性名的形式。这不是强制限制,而是一种约定——告诉其他开发者"这个属性是内部使用的,别直接碰它"。
提示:Python社区更推荐使用单下划线前缀表示"受保护的"属性,双下划线只在需要避免子类属性冲突时使用。
2.3 封装的实践技巧
- 属性装饰器:更优雅的属性访问控制
python复制class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def celsius(self):
return self._celsius
@property
def fahrenheit(self):
return self._celsius * 9/5 + 32
@celsius.setter
def celsius(self, value):
if value < -273.15:
raise ValueError("温度不能低于绝对零度")
self._celsius = value
-
何时该用封装:
- 当属性需要验证或计算时
- 当内部实现可能改变时
- 当需要保护数据不被意外修改时
-
封装过度的问题:不是所有属性都需要getter/setter。简单的数据类(如namedtuple)可能不需要封装。
3. 继承:代码复用的利器
3.1 继承的基本用法
继承让我们可以基于现有类创建新类,避免重复代码。比如各种电子产品都有一些共同特性:
python复制class Device:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def power_on(self):
print(f"{self.brand} {self.model} 开机中...")
def power_off(self):
print(f"{self.brand} {self.model} 关机中...")
class SmartPhone(Device):
def __init__(self, brand, model, os):
super().__init__(brand, model)
self.os = os
def install_app(self, app_name):
print(f"正在安装 {app_name}...")
class Tablet(Device):
def __init__(self, brand, model, screen_size):
super().__init__(brand, model)
self.screen_size = screen_size
