言
本章节主要讲解面向对象中的伪私有属性及其属性的修改办法。
私有属性
什么叫做私有属性?简单来说,就是该属性可以在类中可见,但是外部不可见,不可进行访问的属性就是私有属性。
实现方式
Python中定义私有属性时方法很简单,只需要在属性名或者函数名前加上“__“两个下划线即可,这样就实现了私有化的定义。接下来,咱们通过定义一个类,来看一下私有属性如何实现,下边代码是定义了一个叫做Person的类,继承object类,这样的类我们叫做新式类(在Python3中,我们默认都是新式类,Python3以前版本中类可以分成新式类和经典类两种,大家了解即可)。
# 定义一个关于人的类
class Person(object):
def __init__(self,name,sex):
# 定义公有属性
self.name = name
# 定义私有属性
self.__sex = sex
person = Person("Joe","男")
person.name # 输出的结果:'Joe'
person.__sex # 输出显示报错如下:'Person' object has no attribute '__sex'
但是实际情况中,我们可能想要查看私有属性,这时可以如何操作?下边咱们提供3种方法。推荐使用方法3进行设置。
01
方法一
虽然无法直接查看私有属性,但是我们可以对私有属性__sex
重新赋值,如:person.__sex = '女'
,然后再查看person.__sex
即可成功查看,但是此种方式相当于在person中定义了一个名为__sex 的变量,所以这种方式不会改变类中真正的属性,即:’男‘。
person.__sex = ’女’
person.__sex # 输出的结果:’女’
02
方法二
# 查看私有属性的方法二:
person._Person__sex # 输出的结果:'男'
# 修改私有属性
person._Person__sex = '女' # 将私有属性改变成女
# 再次查看私有属性
person._Person__sex # 输出的结果:'女'
经过上边代码的演示,我们知道:通过在属性名或者函数名前加上“__“两个下划线实现私有属性的方法,其实是一种伪私有属性,所谓的伪是指:这种私有属性是可以改变的。另外,这种方法主要是为了起到避免和外界代码变量产生混淆,防止意外错误发生。
python中使用name mangling技术,当使用“__“
两个下划线定义私有属性时,程序会自动将原属性名变成_+classname(类名)+__原属性名,所以在外部使用原私有属性名时,提示找不到。相反,通过上边代码方式即可查看私有属性及对私有属性进行修改。
03
方法三
通过在方法上面添加 @property的方式(即:在方法上边应用装饰器)实现私有属性的定义和修改,该操作原理是:将方法封装成类属性,通过调用类属性的方式调用方法。在开发中,一般采用方法三进行设置。此外,property类中有相应方法。比如:setter 函数,下边通过代码来看一下代码如何制作和呈现。
# 定义一个关于人的类
class Person(object):
def __init__(self,name,sex):
# 定义公有属性
self.name = name
# 定义私有属性
self.__sex = sex
# 定义私有属性
@property
def sex(self):
return self.__sex
# 修改私有属性
@sex.setter
def sex(self,value):
self.__sex = value #修改原属性:sex
# 创建一个对象
person = Person("Joe","男")
# 查看私有属性sex
person.sex # 输出的结果:'男'
# 修改私有属性sex
person.sex = "女"
# 再次查看私有属性
person.sex # 输出的结果:'女'