封装 #
封装隐藏对象的内部实现细节。
一、访问级别 #
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