三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Python面向对象编程深度解析2026版:从类与对象到设计模式完整教程

Python面向对象编程深度解析2026版:从类与对象到设计模式完整教程

前言

面向对象编程(OOP)是Python的核心编程范式。本文从类与对象基础出发,深入解析继承、多态、封装和设计模式。## 一、类与对象### 1.1 基本概念pythonclass Dog: # 类变量 species = 'Canis familiaris' def __init__(self, name, age): # 实例变量 self.name = name self.age = age # 实例方法 def bark(self): return f'{self.name} says Woof!' # 类方法 @classmethod def from_string(cls, data_str): name, age = data_str.split(',') return cls(name, int(age)) # 静态方法 @staticmethod def is_valid_age(age): return age > 0 and age < 30# 创建对象dog = Dog('Buddy', 3)print(dog.bark()) # Buddy says Woof!### 1.2 魔术方法pythonclass Vector: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return f'Vector({self.x}, {self.y})' def __add__(self, other): return Vector(self.x + other.x, self.y + other.y) def __eq__(self, other): return self.x == other.x and self.y == other.y def __len__(self): return int((self.x**2 + self.y**2)**0.5)v1 = Vector(3, 4)v2 = Vector(1, 2)print(v1 + v2) # Vector(4, 6)print(len(v1)) # 5## 二、封装### 2.1 属性访问控制pythonclass BankAccount: def __init__(self, balance=0): self._balance = balance # 受保护 self.__transactions = [] # 私有 @property def balance(self): return self._balance @balance.setter def balance(self, value): if value < 0: raise ValueError('Balance cannot be negative') self._balance = value def deposit(self, amount): if amount <= 0: raise ValueError('Amount must be positive') self._balance += amount self.__transactions.append(('deposit', amount))account = BankAccount(100)account.deposit(50)print(account.balance) # 150## 三、继承与多态### 3.1 继承pythonclass Animal: def __init__(self, name): self.name = name def speak(self): raise NotImplementedErrorclass Dog(Animal): def speak(self): return f'{self.name} says Woof!'class Cat(Animal): def speak(self): return f'{self.name} says Meow!'# 多态animals = [Dog('Buddy'), Cat('Whiskers')]for animal in animals: print(animal.speak())### 3.2 多重继承与MROpythonclass Swimmer: def swim(self): return 'Swimming'class Flyer: def fly(self): return 'Flying'class Duck(Swimmer, Flyer): passduck = Duck()print(duck.swim()) # Swimmingprint(duck.fly()) # Flyingprint(Duck.__mro__) # 方法解析顺序## 四、设计模式### 4.1 单例模式pythonclass Singleton: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instances1 = Singleton()s2 = Singleton()print(s1 is s2) # True### 4.2 工厂模式pythonclass AnimalFactory: @staticmethod def create(animal_type, name): if animal_type == 'dog': return Dog(name) elif animal_type == 'cat': return Cat(name) raise ValueError(f'Unknown animal: {animal_type}')animal = AnimalFactory.create('dog', 'Buddy')### 4.3 观察者模式pythonclass Subject: def __init__(self): self._observers = [] def attach(self, observer): self._observers.append(observer) def notify(self, data): for observer in self._observers: observer.update(data)class Observer: def update(self, data): print(f'Received: {data}')## 五、SOLID原则| 原则 | 含义 | 示例 ||—|—|—|| S - 单一职责 | 一个类只负责一件事 | User类不处理数据库连接 || O - 开闭原则 | 对扩展开放,对修改关闭 | 用继承扩展功能 || L - 里氏替换 | 子类可以替换父类 | Cat可以替代Animal || I - 接口隔离 | 掆面接口而非胖接口 | 分离Swimmer和Flyer || D - 依赖倒置 | 依赖抽象不依赖具体 | 依赖ABC而非实现类 |—## 六、Python现代OOP特性Python 3.7+引入了多项现代化OOP特性,显著提升了类定义的简洁性和类型安全性。### 6.1 dataclass装饰器dataclass自动生成__init__、repr、__eq__等方法,大幅减少样板代码。特别适合定义数据容器类。支持默认值、类型注解、不可变实例(frozen=True)和字段自定义。相比传统类定义,dataclass让代码更聚焦于业务字段而非基础设施方法。### 6.2 类型注解与运行时检查Python的类型注解系统(typing模块)虽然不强制运行时检查,但配合mypy等静态检查工具可以在开发阶段捕获类型错误。Protocol类实现了结构化子类型(鸭子类型的静态版本),Protocol不需要显式继承就能满足接口约束,这在设计松耦合系统时非常实用。### 6.3 __slots__优化内存默认情况下Python对象用__dict__存储属性,内存开销大。定义__slots__后对象改用固定大小的数组存储属性,内存占用可减少40%-50%。在创建大量对象的场景下(如解析百万级数据行),__slots__是关键的内存优化手段。代价是不能再动态添加新属性。Python OOP的核心是合理使用类、继承和多态来组织代码。掌握设计模式和SOLID原则,可以写出更可维护的代码。

← 返回列表