首页技术文章正文

Python培训:封装(隐藏数据和保护属性)

更新时间:2022-08-03 来源:黑马程序员 浏览量:

  通常把隐藏属性、方法与方法实现细节的过程称为封装。为了保护类里面的属性,避免外界随意赋值,可以采用如下方式解决:

  ·把属性定义为私有属性,即在属性名的前面加上两个下划线。

  ·添加可以供外界调用的两个方法,分别用于设置或者获取属性值。

  在介绍封装之前,我们先来看一段示例代码,具体如下:

class Person: # 定义一个类
    def __init__(self, name, age): # 构造方法
        self.name = name # 姓名
        self.age = age   # 年龄
person = Person("老王", 30) # 创建一个对象
person.age = 300
print(person.age)

  在上述示例中,定义了一个Person类,该类中有name(姓名)和age(年龄)两个属性。使用Person类的构造方法创建一个对象,并设置nage和age的初始值为“老王”和“30”,接着动态地设置age的值为300.从现实生活角度来看,这个年龄的设置是不符合逻辑的。

  下面采用封装的方式,对上述代码进行修改,具体如例12-1所示。

  例12-1 私有属性.py

class Person: # 定义一个类
    def __init__(self, name, age): # 构造方法
        self.name = name # 姓名
        self.age = age   # 年龄
    # 给私有属性赋值
    def set_age(self, new_age):
        # 判断传入的参数是否符合要求,符合后才能赋值
        if new_age > 0 and new_age <=120:
            self._age = new_age
    # 获取私有属性的值
    def get_age(self):
        return self._age
# 创建对象
person = Person("老王", 30)
print(person._age)

  在例12-1中,定义了一个Person类。其中,第4行在构造方法中添加了一个私有属性_age,然后在第6~9行定义了一个给私有属性赋值的方法,通过使用if语句来判断设置值的合理性,然后在第11~12行定义了一个供外界获取私有属性值的方法。第14~15行使用构造方法创建一个Person类的对象,并将直接获取到的_age属性的值打印出来。运行程序后,程序出现如下错误信息,具体如图12-1所示。

  从图12-1提示的错误信息可以看出,在Person类中没有找到_age属性。出现上述问题,原因在于_age属性为私有属性,类的外面无法知道类里面的私有属性,更无法访问类的私有属性。所以,为了能在外界访问私有属性的值,需要用到该类提供的用于设置和获取属性值的方法。

1659496113256_提示没有_age属性的错误信息.jpg

图12-1 提示没有_age属性的错误信息

  在例12-1中,把第15行代码改为调用set_age和get_age方法分别对属性进行赋值和取值的操作,代码如下。

person.set_age(31)
print(person.get_age())

  程序运行的结果如图12-2所示。

1659496467399_图12-2-运行结果.jpg

  图12-2 运行结果

  从图12-2的结果可以看出,外界通过提供的set_age和get_age方法分别设置和获取了私有属性_age的值。Python中没有任何关键字来区分公有属性和私有属性,它是以属性命名的方法进行区分的,如果属性名的前面加了两个下划线,就表明该属性是私有属性,否则就是公有属性。

分享到:
在线咨询 我要报名
和我们在线交谈!