在面向对象编程中,数据封装对于对象的安全性是十分重要的,没有封装好的话,可能会让一些恶意攻击者篡改数据。
首先我们看一段简单的代码
class monster():
def __init__(self,hp):
self.hp = hp
a = monster(10)
print(a.hp)
我简单的定义了一个monster类,带有一个hp的属性,然后我们实例化一个a对象,并使用print方法简单地打印了a对象的hp值
运行结果如下
10
Process finished with exit code 0
然后我们试图在外部直接修改a对象的属性值,然后再次打印一下看它的属性值是否改变了
class monster():
def __init__(self,hp):
self.hp = hp
a = monster(10)
print(a.hp)
# 以下是新添加的代码段
a.hp = 20
print(a.hp)
返回结果
10
20
Process finished with exit code 0
这里我们就很轻松地访问了a对象的hp属性并把它从10修改为20
但这也带来一个隐藏的风险,就是如果这是一款打怪类的游戏,我们就能轻而易举地修改怪物血量,从而影响游戏整体运行
所以最保险的方法当然是把这个数据封装起来,即封到一个保险箱里,在有必要修改它的情况下,再调用相关函数去修改
这里python给了一个解决方法就是在类中的初始化函数里,在你需要封装的变量前加两道下划线,注意是两道!!!!我们来尝试一下把hp封装起来
class monster():
def __init__(self,hp):
self.__hp = hp
a = monster(10)
print(a.__hp)
程序运行出现了错误,因为没有权限去访问这个变量
这种封装后的变量我们如果想要知道它的值,就需要在类里实现这个功能,因为这是内部才能访问到的属性,所以我们多定义一个打印该属性的方法
class monster():
def __init__(self,hp):
self.__hp = hp
def print_hp(self):
print(self.__hp)
a = monster(10)
a.print_hp() # 调用该方法打印封装后的hp值
运行结果
10
Process finished with exit code 0
这样就能打印出来我们封装过后的变量
但是我们在外部无法访问该变量值,也就更不可能修改该变量的值,那如果碰到需要修改的情况怎么办?
同样我们也是要在类里写一个更新属性值的方法
class monster():
def __init__(self,hp):
self.__hp = hp
def print_hp(self):
print(self.__hp)
def upgrade_hp(self,hp):
self.__hp = hp
a = monster(10)
a.print_hp() # 调用该方法打印封装后的hp值
#以下是新添加的代码
a.upgrade_hp(20) # 调用该方法更新hp值
a.print_hp()
10
20
Process finished with exit code 0
我们通过调用upgrade_hp这个方法改变了hp该属性值
这仅仅是一个简单的案例,用来分享自己最近学习面向对象编程的封装的心得
现有的案例仍然存在部分权限问题,只是来帮助大家理解数据封装的重要性!