面试题答案
一键面试实现属性的私有访问控制
在Python中,并没有严格意义上的私有属性,但是可以通过在属性名前加双下划线 __
来模拟私有属性。这会导致Python在内部对属性名进行改写,外部无法直接访问。
示例代码如下:
class MyClass:
def __init__(self):
self.__private_attribute = 42
def get_private_attribute(self):
return self.__private_attribute
obj = MyClass()
# 以下代码会报错,因为无法直接访问私有属性
# print(obj.__private_attribute)
print(obj.get_private_attribute())
实际项目中的应用场景
- 数据封装与保护:在一个用户信息管理模块中,用户的密码应该是严格保密的。可以将密码属性设为私有,只提供通过验证的方法来修改密码。
class User:
def __init__(self, username, password):
self.username = username
self.__password = password
def change_password(self, old_password, new_password):
if old_password == self.__password:
self.__password = new_password
print("密码修改成功")
else:
print("旧密码错误,修改失败")
user = User('testuser', '123456')
user.change_password('123456', 'newpassword')
- 避免外部直接修改内部状态:在一个游戏角色类中,角色的生命值(
health
)是一个关键属性,不希望外部随意修改导致游戏逻辑混乱。可以将生命值设为私有,通过特定的方法来减少或增加生命值,比如受到攻击或者使用道具时。
class GameCharacter:
def __init__(self):
self.__health = 100
def take_damage(self, damage):
if damage > 0:
self.__health -= damage
if self.__health <= 0:
self.__health = 0
print("角色死亡")
else:
print(f"角色受到 {damage} 点伤害,剩余生命值: {self.__health}")
def heal(self, heal_amount):
if heal_amount > 0:
self.__health += heal_amount
if self.__health > 100:
self.__health = 100
print(f"角色恢复了 {heal_amount} 点生命值,当前生命值: {self.__health}")
character = GameCharacter()
character.take_damage(30)
character.heal(20)