Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain

4. Python 面向对象编程

4.3 封装与抽象

封装与抽象是面向对象编程(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
            print(f"Deposited {amount}. New balance: {self.__balance}")
        else:
            print("Deposit amount must be positive.")

    def withdraw(self, amount):
        if 0 < amount <= self.__balance:
            self.__balance -= amount
            print(f"Withdrew {amount}. New balance: {self.__balance}")
        else:
            print("Invalid withdrawal amount.")

    def get_balance(self):
        return self.__balance

# 使用 BankAccount 类
account = BankAccount("Alice", 1000)
account.deposit(500)
account.withdraw(200)
print(account.get_balance())  # 输出: 1300
# print(account.__balance)  # 报错: AttributeError

在上面的例子中,__balance 是一个私有属性,外部无法直接访问。通过 deposit 和 withdraw 方法,可以安全地修改余额,而 get_balance 方法提供了获取余额的接口。

抽象

抽象是指将复杂的系统简化为一个模型,只关注系统的核心功能,而忽略不必要的细节。在面向对象编程中,抽象通常通过抽象类或接口来实现。

Python 中的抽象类是通过 abc 模块中的 ABC 类和 abstractmethod 装饰器来定义的。抽象类不能被实例化,只能被继承。子类必须实现抽象类中定义的抽象方法。

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    def perimeter(self):
        return 2 * (self.width + self.height)

# 使用 Rectangle 类
rectangle = Rectangle(5, 10)
print(rectangle.area())  # 输出: 50
print(rectangle.perimeter())  # 输出: 30

# shape = Shape()  # 报错: TypeError

在上面的例子中,Shape 是一个抽象类,定义了 area 和 perimeter 两个抽象方法。Rectangle 类继承了 Shape 并实现了这两个方法。抽象类 Shape 不能被实例化,只能通过子类来使用。

封装与抽象的关系

封装和抽象是相辅相成的。封装通过隐藏实现细节来保护数据,而抽象通过简化接口来提供清晰的模型。两者共同作用,使得代码更加模块化、易于理解和维护。

在实际开发中,合理地使用封装和抽象可以显著提高代码的质量和可扩展性。通过封装,可以确保数据的安全性和一致性;通过抽象,可以定义清晰的接口,降低模块之间的耦合度,从而提高代码的复用性和灵活性。

总结
  • 封装:通过访问控制隐藏实现细节,保护数据不被外部直接访问或修改。
  • 抽象:通过抽象类或接口简化系统模型,只暴露核心功能,忽略不必要的细节。
  • 关系:封装和抽象共同作用,使得代码更加模块化、易于理解和维护。

通过掌握封装与抽象的概念,开发者可以编写出更加健壮、可维护的面向对象代码。

Last Updated:: 3/17/25, 7:20 PM