在我们探索 Python 中高级类特性的基础上,本文深入探讨了面向对象编程(OOP)的理论基础。我们将揭示关键的 OOP 概念,如继承、封装、多态、组合、抽象、聚合和关联,以及它们在 Python 中的实际应用。此外,我们还将探讨方法解析顺序(MRO)和关键设计模式,为你提供全面的理解,以增强你的 Python 编程技能。
OOP 基础
Python 中的面向对象编程建立在四个基本概念之上:抽象、继承、封装和多态。另外,还值得一提的是组合、抽象、聚合和关联。这些基本不仅是理论构造,它们也是塑造我们编写和组织 Python 代码的实用工具。
抽象
抽象是关于聚焦于某物的基本特性,而不是一个特定实例。在 OOP 中,这意味着专注于对象做什么,而不是它如何做到的。
这通常通过使用抽象类和方法来实现。抽象类是不能单独实例化的类,并且需要子类提供抽象方法的实现。
from abc import ABC, abstractmethod
class AbstractVehicle(ABC):
@abstractmethod
def move(self):
pass
class Car(AbstractVehicle):
def move(self):
print("Car is moving")
# 抽象交通工具无法实例化,但实现了抽象方法的汽车可以。
继承
继承是一种机制,新的类(称为子类)从现有类(父类)中派生属性和行为(方法)。这个概念对于创建层次结构和在类之间共享代码至关重要。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return f"{
self.name} says Woof!"
class Cat(Animal):
def speak(self):
return f"{
self.name} says Meow!"
dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.speak()) # Output: Buddy says Woof!
print(cat.speak()) # Output: Whiskers says Meow!
最好使用继承来建模明确的“是一个”关系。当“有一个”关系更合适时,请避免使用它,因为这可能导致不恰当的耦合。要注意深度继承层次结构,因为它们可能变得难以管理和理解。当你发现自己在强行适应时,更喜欢组合而不是继承。
封装
封装通过仅暴露选定的方法和属性来保护对象的内部状态。这降低了意外干扰和错误的风险。
class Account:
def __init__(self, id, balance=0):
self.__id = id # Private attribute
self.__balance = balance
def deposit(self, amount):
if amount > 0:
self.__balance += amount
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
return amount
return "Insufficient balance"
def get_balance(self):
return self.__balance
account = Account(1, 1000)
account.deposit(500)
print(account.get_balance()) # 1500
account.withdraw(200)
print(account.get_balance()) # 1300
总是使用 getter 和 setter 方法来访问和修改私有属性。除非必要,否则不要暴露内部状态。这种方法不仅保护了数据,而且使将来对实现的更改变得更容易。
多态
多态使不同类的对象能够被视为一个共同超类的对象。它的核心是使用单一接口表示不同的底层形式(数据类型)。
class Rectangle:
def draw(self):
return "绘制一个矩形"
class Circle:
def draw(self):
return