更新时间: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中没有任何关键字来区分公有属性和私有属性,它是以属性命名的方法进行区分的,如果属性名的前面加了两个下划线,就表明该属性是私有属性,否则就是公有属性。