从形式上看,在定义类的成员时,如果成员名以两个下划线(__)开头则表示是私有成员,但是Python并没有对是有成员提供严格访问保护机制。私有成员在类的外部不能直接访问,一般是在类的内部进行访问和操作,或者在类外部通过调用对象的公有成员方法来访问。另外,Python提供了一种特殊方式“对象名._类名__xxx”可以访问私有成员,但这会破坏类的封装性,不推荐这样做(不过真的很难阻止别人这么做)。公有属性是可以公开使用的,既可以在类的内部进行访问,也可以在外部程序中使用。
1 class A():
2 def __init__(self,value1=0,value2=0): # 类的构造函数
3 self._value1 = value1 # _value1是非私有成员
4 self.__value2 = value2 # __value2 是私有成员
5
6 def setvalue(self,value1,value2): #定义一个成员方法,用来修改私有成员的值
7 self._value1 = value1
8 self.__value2 = value2 #在类的内部可以直接访问私有成员
9
10 def show(self): #定义一个成员方法,用来向外界展示私有成员的
11 print(self._value1)
12 print(self.__value2)
13
14 if __name__ == '__main__':
15 a = A()
16
17 print(a._value1) #在类外部可以直接访问非私有成员
18 #print(a.__value2) #在类外部不能访问私有成员
19 print(a._A__value2) #可以用这种方式在类外部访问对象的私有数据成员
在Python中,以下划线开头和结束的成员名有特殊的含义,类定义中使用下划线作为变量名和方法名前缀和后缀来表示类的特殊成员。
(1)_xxx :保护成员,不能用‘from module import *’导入,只有类对象和子类对象可以访问这些成员。
(2)__xxx__:系统定义的特殊成员,详见4.1.7节。
(3)__xxx:类中的私有成员,一般只有类对象自己能访问,子类对象也不能访问到这个成员,但是在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。
注意:Python中不存在严格意义上的私有成员。