封装是面向对象编程的另一个重要概念。它指的是将对象的属性和方法包装在一个类中,从而隐藏它们的实现细节。封装的主要优点是提高了代码的可维护性、可重用性和安全性。在本节中,我们将讨论封装的基本概念,并通过实例代码展示如何在 Python 中实现封装。
在 Python 中,可以使用双下划线(__
)前缀来定义私有属性和私有方法。这表示这些属性和方法只能在类内部访问,而不能在类外部访问。以下是一个示例:
class BankAccount: def __init__(self, account_number, balance): self.__account_number = account_number self.__balance = balance def deposit(self, amount): self.__balance += amount def withdraw(self, amount): if self.__is_sufficient_balance(amount): self.__balance -= amount else: print("Insufficient balance!") def get_balance(self): return self.__balance def __is_sufficient_balance(self, amount): return self.__balance >= amount account = BankAccount("123456", 500) account.deposit(200) account.withdraw(100) print(account.get_balance()) # 输出结果:600
在这个示例中,我们定义了一个名为 BankAccount
的类,它具有两个私有属性 __account_number
和 __balance
,以及一个私有方法 __is_sufficient_balance()
。这些私有属性和方法只能在 BankAccount
类内部访问,而不能在类外部访问。
我们还定义了几个公共方法:deposit()
、withdraw()
和 get_balance()
,它们允许在类外部操作 BankAccount
类的实例。这些方法提供了访问私有属性和私有方法的接口,同时隐藏了它们的实现细节。
在 Python 中,可以使用属性装饰器(@property
)将一个方法转换为只读属性。这允许我们在不修改类外部代码的情况下,将属性的访问逻辑封装在类内部。以下是一个示例:
class Circle: def __init__(self, radius): self.__radius = radius @property def radius(self): return self.__radius @property def diameter(self): return self.__radius * 2 @property def area(self): return 3.14159 * self.__radius ** 2 circle = Circle(5) print(circle.radius) # 输出结果:5 print(circle.diameter) # 输出结果:10 print(circle.area) # 输出结果:78.53975
在这个示例中,我们定义了一个名为 Circle
的类,它具有一个私有属性 __radius
。我们还定义了三个属性装饰器:radius
(读取 __radius
的值)、diameter
(计算圆的直径)和 area
(计算圆的面积)。这些属性装饰器将方法转换为只读属性,允许我们在类外部像访问属性一样访问它们。
除了属性装饰器外,还可以使用设定器(setter)装饰器(@<attribute>.setter
)定义属性的设定方法。以下是一个示例:
class Circle: def __init__(self, radius): self.__radius = radius @property def radius(self): return self.__radius @radius.setter def radius(self, value): if value < 0: raise ValueError("Radius cannot be negative.") self.__radius = value circle = Circle(5) circle.radius = 10 # 设置新的半径值 print(circle.radius) # 输出结果:10
在这个示例中,我们为 Circle
类添加了一个名为 radius
的设定器装饰器。它定义了一个名为 radius()
的方法来设置私有属性 __radius
的值。在这个方法中,我们还添加了一个简单的验证逻辑,确保半径值不为负数。
通过使用封装,我们可以在类内部隐藏实现细节,从而提高代码的可维护性、可重用性和安全性。在 Python 中,我们可以使用私有属性、私有方法、属性装饰器和设定器装饰器来实现封装。
在本节中,我们学习了如何在 Python 中实现封装。我们讨论了以下概念:
__
)前缀定义的属性和方法,只能在类内部访问。@property
装饰器将一个方法转换为只读属性,允许在类外部像访问属性一样访问它。@<attribute>.setter
装饰器定义属性的设定方法,允许在类外部设置属性的值。通过实例代码,我们学习了如何在 Python 中使用这些概念来实现封装。希望这些示例能帮助你更好地理解和掌握封装的概念。如果你有任何问题,请随时提问。
参考文章:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g