封装 #

封装隐藏对象的内部实现细节。

一、访问级别 #

python
class MyClass:
    def __init__(self):
        self.public = "公开"        # 公开属性
        self._protected = "保护"    # 保护属性(约定)
        self.__private = "私有"     # 私有属性(名称修饰)

obj = MyClass()
print(obj.public)      # "公开"
print(obj._protected)  # "保护"(可访问但不推荐)
# print(obj.__private) # AttributeError
print(obj._MyClass__private)  # "私有"(可访问但不推荐)

二、私有属性实现 #

python
class BankAccount:
    def __init__(self, balance):
        self.__balance = balance
    
    def get_balance(self):
        return self.__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 0

account = BankAccount(1000)
account.deposit(500)
print(account.get_balance())  # 1500

三、使用property #

python
class Temperature:
    def __init__(self, celsius):
        self._celsius = celsius
    
    @property
    def celsius(self):
        return self._celsius
    
    @celsius.setter
    def celsius(self, value):
        if value >= -273.15:
            self._celsius = value
        else:
            raise ValueError("温度不能低于绝对零度")
    
    @property
    def fahrenheit(self):
        return self._celsius * 9/5 + 32

temp = Temperature(25)
print(temp.celsius)     # 25
print(temp.fahrenheit)  # 77.0
temp.celsius = 30

四、封装的好处 #

python
class Student:
    def __init__(self, name, score):
        self._name = name
        self._score = score
    
    @property
    def score(self):
        return self._score
    
    @score.setter
    def score(self, value):
        if 0 <= value <= 100:
            self._score = value
        else:
            raise ValueError("分数必须在0-100之间")
    
    @property
    def grade(self):
        if self._score >= 90:
            return 'A'
        elif self._score >= 80:
            return 'B'
        elif self._score >= 60:
            return 'C'
        return 'D'

student = Student("Tom", 85)
print(student.grade)  # "B"
student.score = 95
print(student.grade)  # "A"
# student.score = 150  # ValueError

五、总结 #

约定 命名 访问性
公开 name 任意访问
保护 _name 内部和子类访问
私有 __name 名称修饰,外部难以访问
属性 @property 控制访问逻辑
最后更新:2026-03-16