更新时间: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属性为私有属性,类的外面无法知道类里面的私有属性,更无法访问类的私有属性。所以,为了能在外界访问私有属性的值,需要用到该类提供的用于设置和获取属性值的方法。

图12-1 提示没有_age属性的错误信息
在例12-1中,把第15行代码改为调用set_age和get_age方法分别对属性进行赋值和取值的操作,代码如下。
person.set_age(31) print(person.get_age())
程序运行的结果如图12-2所示。

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