Python编程基础与科学计算
上QQ阅读APP看书,第一时间看更新

3.2.5 属性和方法的私密性

前面介绍的在类内定义的变量(实例变量、类变量)和函数(实例函数和类函数)对外都是可见的,而且也能被子类继承,这样使得数据的私密性不严,也不符合类的封装性要求。Python可以根据需求把类内部的变量和函数进行密闭分级。Python类的数据密闭性分为以下三级。

  • 对外完全公开的数据(public)。前面实例中使用的变量(属性)和函数(方法)对外都是公开的,既可以在类内部又可以在类外部引用,也可以被子类继承,成为子类的变量和函数,如果把类存储到一个文件中,作为一个模块来使用,当在其他程序中用import语句导入类时,类内的变量和函数都可以导入进来。
  • 受保护的数据(protected)。当类内的变量名或函数名前加1个下画线“_”时,例如self._age,这时类的变量或函数是受保护的,受保护的变量和函数可以在类内被使用,也可以在类外通过“实例名.变量名”或“实例名.函数名()”的形式使用或调用,还可以被子类继承,但是不能用import语句导入到其他程序中。
  • 私有的数据(private)。当类内的变量名或函数名前加两个下画线“__”时,例如self.__ age,这时类的变量或函数是类私有的数据,只能在类内使用,不能在类外使用,不能用“实例名.变量名”或“实例名.函数名()”的形式使用或调用,也不能被子类继承,更不能用import语句导入到其他程序中。

另外,Python中还有一些具有特殊意义的数据,其名称前后都加了两个下画线,例如__init__,这些前后都加了两个下画线的数据在Python中有特殊的作用。

由于私有变量对外是不可见的,因此可以在类内定义私有变量的输入函数和输出函数,通过函数使其对外可见,例如下面的程序:

前面已经讲过,用@property修饰的函数可以当作属性使用,@property经常应用到不需要输入参数的函数中,例如上面的输出函数。另外,对于用@property修饰的函数,可以设置另一个与之相对应的同名输入函数,需要用@xx.setter进行修饰,其中xx是用@property修饰过的函数名。另外,还可以用@xx.deleter修饰一个用于删除变量的函数,例如下面的程序。