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 代码的关键。

学习目标:理解类与对象的关系,熟练运用继承、封装和多态,合理设计类结构以提升代码质量。

Xiaoye