Python中关于数据封装

在面向对象编程中,数据封装对于对象的安全性是十分重要的,没有封装好的话,可能会让一些恶意攻击者篡改数据。

首先我们看一段简单的代码

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该属性值

这仅仅是一个简单的案例,用来分享自己最近学习面向对象编程的封装的心得
现有的案例仍然存在部分权限问题,只是来帮助大家理解数据封装的重要性!

猜你喜欢

转载自blog.csdn.net/weixin_44106928/article/details/88058264