~~核心编程(六):面向对象——封装~~

进击の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

    所以其实还是能改的


*有点东西*
*继续深究*

猜你喜欢

转载自www.cnblogs.com/jevious/p/11207743.html