7. 面向对象编程¶
7.1 类与对象的基本概念¶
类(Class) 是对象的蓝图或模板,定义了对象的属性和方法。对象(Object) 是类的实例,包含具体的属性值和行为。
class Person:
"""人类类 - 定义人的基本属性和行为"""
species = "智人" # 类属性
def __init__(self, name, age): # 构造方法
self.name = name # 实例属性
self.age = age
def greet(self): # 实例方法
return f"你好,我是{self.name},今年{self.age}岁"
# 创建对象
person = Person("张三", 25)
print(person.greet()) # 调用实例方法
print(Person.species) # 访问类属性
7.2 类的属性与方法¶
实例属性 是每个对象独有的数据,类属性 是所有对象共享的数据。
class Car:
wheels = 4 # 类属性
def __init__(self, brand, model):
self.brand = brand # 实例属性
self.model = model
def start_engine(self): # 实例方法
return f"{self.brand} {self.model} 引擎启动"
# 类属性与实例属性
car1 = Car("丰田", "卡罗拉")
car2 = Car("本田", "雅阁")
print(car1.brand) # 实例属性访问
print(Car.wheels) # 类属性访问
print(car1.start_engine()) # 调用实例方法
7.3 构造方法与析构方法¶
构造方法 __init__ 在对象创建时自动调用,用于初始化属性;析构方法 __del__ 在对象销毁时调用,用于资源清理。
class FileHandler:
def __init__(self, filename):
self.filename = filename
print(f"文件 {filename} 已打开")
def write(self, data):
print(f"写入数据到 {self.filename}: {data}")
def __del__(self):
print(f"文件 {self.filename} 已关闭")
# 使用对象
with open("test.txt", "w") as f:
f.write("测试数据")
7.4 继承与多态¶
继承 允许子类复用父类的属性和方法,多态 实现同一接口的不同行为。
class Animal:
def speak(self):
return "动物发出声音"
class Dog(Animal): # 继承Animal类
def speak(self): # 重写父类方法
return "汪汪!"
class Cat(Animal):
def speak(self):
return "喵喵!"
# 多态示例
animals = [Dog(), Cat()]
for animal in animals:
print(animal.speak()) # 输出:汪汪!和喵喵!
7.5 封装与访问控制¶
通过命名约定实现封装:
- 公有属性(name):直接访问
- 受保护属性(_age):约定不直接访问
- 私有属性(__id):名称改写为 _ClassName__id
class BankAccount:
def __init__(self, account_id, balance):
self.__account_id = account_id # 私有属性
self._balance = balance # 受保护属性
def get_balance(self):
return self._balance
account = BankAccount("12345", 1000)
print(account.get_balance()) # 安全访问
print(account._balance) # 不推荐直接访问
7.6 特殊方法(魔术方法)¶
特殊方法以双下划线开头和结尾,如 __init__、__str__ 等,用于实现内置行为。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self): # 字符串表示
return f"({self.x}, {self.y})"
def __add__(self, other): # 重载加法运算符
return Point(self.x + other.x, self.y + other.y)
p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1 + p2) # 输出:(4, 6)
7.7 高级特性¶
数据类(Python 3.7+)简化数据存储类定义:
from dataclasses import dataclass
@dataclass
class Student:
name: str
age: int
grade: str = "未分配"
student = Student("李四", 18, "高三")
print(student) # 自动生成 __repr__ 方法
抽象基类(ABC)强制子类实现特定方法:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self): # 抽象方法
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self): # 必须实现抽象方法
return 3.14 * self.radius ** 2
circle = Circle(5)
print(circle.area()) # 输出:78.5
7.8 类的高级应用¶
- 类装饰器:动态修改类行为
- 描述符:控制属性访问(如验证、类型检查)
- 上下文管理器:使用
with语句管理资源(如文件)
class ContextManager:
def __enter__(self):
print("进入上下文")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("退出上下文")
return False
with ContextManager():
print("执行上下文内代码")
总结¶
面向对象编程通过封装、继承、多态三大特性,帮助我们组织代码结构,提高复用性和可维护性。Python 提供了丰富的 OOP 特性,从基础类定义到高级装饰器和抽象基类,可灵活应对复杂需求。掌握 OOP 是编写高效 Python 代码的关键。
学习目标:理解类与对象的关系,熟练运用继承、封装和多态,合理设计类结构以提升代码质量。