进击のpython
封装
什么是封装呢?
在前面是不是写过这样的代码
class Dog:
froom = "ch"
def __init__(self, name, age, kind="erha"):
self.blood = 100
self.kind = kind
self.age = age
self.name = name
在当时我是不是说__ini__下放的是实例的私有变量?
其实这么说是不对的
这只能说是实例变量,或者是成员变量
当时只是为了让你能够好理解才那么表述的
这才算是私有属性
玩过角色扮演类游戏的都知道
每个人物都是有基础属性且不可被修改的
很明显,如果我还是像上面那么定义一个私有属性的话
那我在外面就可以调用并且修改
class Dog:
froom = "ch"
def __init__(self, name, age, kind="erha"):
self.blood = 100
self.kind = kind
self.age = age
self.name = name
pass
d = Dog("ponny", 3)
d.blood += 10
print(d.blood)
但是我不想在外面修改,因为这毕竟算是个“不可变的”参数
这就引出来我们要说的东西,封装
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了代码数据的安全性。
-
如何封装
那怎么才能够把100这个数据进行封装呢?
首先我们要先把他变成私有变量
方法很简单
前面加上“__”
就是这样
self.__blood = 100
这样设定完之后,在外面就不会被调用
看到了吧,当实例化之后,调用方法的时候就没有blood,更别说修改了,调都调不出来
那封装的目的是保护数据,而不是看不到或者拿不到数据
所以封装的第二步就是写一个函数,让私有变量参与进来
class Dog: froom = "ch" def __init__(self, name, age, kind="erha"): self.kind = kind self.age = age self.name = name self.__boold = 100 def fight(self): self.__boold -= 20 print(f"受伤了,还剩{self.__boold}血量") d = Dog("ponny", 3) d.fight()
受伤了,还剩80血量
其实也可以看出来,虽然在外界能看到,但是拿到的其实是打印值(如果写的是return,拿到的就是返回值)
而这些值,你都没有办法在外面修改,就相当于这个值变成了 只读 模式
这就大大的加强了这个数据的安全性,对吧
除非被函数操作修改,否则是不会被改变的
以上的操作就是对blood这个属性的封装
当然不止可以封装属性,也可以封装函数
操作方法一样,在函数名前面加__
同样,在外面无法直接调用
只能通过类里面的函数调用
class Dog: froom = "ch" def __init__(self, name, age, kind="erha"): self.kind = kind self.age = age self.name = name self.__boold = 100 def __adod(self): print("需要加血!!!!") def fight(self): self.__boold -= 20 print(f"受伤了,还剩{self.__boold}血量") self.__adod() d = Dog("ponny", 3) d.fight()
受伤了,还剩80血量 需要加血!!!!
看,函数(方法)也是可以被封装起来的。(练几下)
-
不能修改?
真不能修改?
不是的,是可以修改的
这种机制也并没有真正意义上限制我们从外部直接访问属性,
知道了类名和属性名就可以拼出名字:类名_属性
然后就可以访问了
print(d._Dog__boold)
100
而且能拿到就能改
d._Dog__boold = 500 print(d._Dog__boold)
500
所以其实还是能改的