xx: 公有化变量
_x:前面带一个下划线,只是标明是私有属性或者方法,对访问没有影响。
__x:避免与子类的属性命名冲突,无法在外部直接访问。(名字被重整成 _className__x)
注意:无法再外部直接访问,但是外部可以创建同名的变量。如下。这是新建的变量只属于该示例。
class Test(object):
def __init__(self):
self.__age=18
def setAge(self,num):
self.__age=num
def getAge(self):
return self.__age
if __name__=='__main__':
myTest = Test()
# print(test.__age) #这一行会报错: AttributeError: 'Test' object has no attribute '__age'
myTest.__age=20
print(myTest.__age) #输出为20
print(myTest.getAge()) #输出为18
而且,__双下划线实现私有化的方式只是简单的进行了重命名,dir(实例名)可以看到_Test__age这个属性,即双下划线定义的属性可以通过_classname__propertyName访问。
print(myTest._Test__age) #输出18
如何简单的获取,设置所谓的私有变量呢?出来上面给出的setAge()和getAge()的实现,python也给出了两种更简单的实现。
1.利用property函数
class Test(object):
def __init__(self):
self.__age=18
def setAge(self,num):
self.__age=num
def getAge(self):
return self.__age
age = property(getAge ,setAge) #注意:getAge和setAge的顺序不能调换
if __name__=='__main__':
myTest = Test()
myTest.age=22
print(myTest.age) #输出22
print(myTest.getAge()) #输出22
2.利用property装饰器
class Test(object):
def __init__(self):
self.__age=18
def getAge(self):
return self.__age
@property
def age(self):
return self.__age
@age.setter
def age(self,num):
self.__age=num
if __name__=='__main__':
myTest = Test()
myTest.age=22
print(myTest.age) #输出22
print(myTest.getAge()) #输出22
x_:避免与python关键字冲突,如: class_ 不推荐使用。