7.4 【基础】类的封装(Encapsulation)

封装是指将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现,外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现。

要了解封装,离不开“私有化”,就是将类或者是函数中的某些属性限制在某个区域之内,外部无法直接调用。

关于什么是 私有化变量和私有化函数,在上一节我已经很详细的讲过啦。

私有变量和私有方法,虽然有办法访问,但是仍然不建议使用上面给出的方法直接访问,而应该接口统一的接口(函数入口)来对私有变量进行查看、变量,对私有方法进行调用。这就是封装。

正是由于封装机制,程序在使用某一对象时不需要关心该对象的数据结构细节及实现操作的方法。使用封装能隐藏对象实现细节,使代码更易维护,同时因为不能直接调用、修改对象内部的私有信息,在一定程度上保证了系统安全性。类通过将函数和变量封装在内部,实现了比函数更高一级的封装。

请看下面这段代码

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

xh = Person(name="小红", age=27)
if xh.age >= 18:
    print(f"{xh.name}已经是成年人了")
else:
    print(f"{xh.name}还是未年人")

我定义了一个 Person 的类,它有 name 和 age 两个属性。

如果想判断小明是不是成年人,需要使用 xh.age 来与 18 比较。

对于很多女生还来说,年龄是非常隐私的。如果不想年龄被人随意就获取,可以在 age 前加两个下划线,将其变成一个私有变量。外界就无法随随便便就知道某个人年龄啦。

如此一来,想要知道一个人是否是成年人,该怎么办呢?

这时候,就该 封装 出场啦。

我可以定义一个用于专门判断一个人是否成年人的函数,对 self.__age 这个属性进行封装。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    def is_adult(self):
        return self.__age >= 18

xh = Person(name="小红", age=27)
xh.is_adult()