私有变量
Python的私有变量表示形式__xx(两道下划线),只有内部可以访问,外部不能访问
class Student(object):
def __init__(self,name,score):
self.__name=name
self.__score=score
def printName(self):
print('name:',self.__name)
def printScore(self):
print('score:',self.__score)
stu=Student('Bob',90)
stu.printName()
stu.printScore()
print(stu.__name)
报错
AttributeError: 'Student' object has no attribute '__name'
注意:变量名前后各两道下划线__xx__是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
如果我们尝试在外部修改__name变量
stu=Student('Bob',90)
stu.__name='Jack'
stu.printName()
stu.printScore()
name: Bob
score: 90
结果并没有改变,其实我们并没有改变内部的__name变量,而是在外部又增加了一个__name变量。可是这两个变量不会重名吗?实际上,Python解释器对外把__name变量改成了_Student__name。仍然可以通过_Student__name来访问内部的__name变量。这说明双下划线开头的实例变量其实可以从外部访问:
stu=Student('Bob',90)
stu._Student__name='Jack'
stu.printName()
stu.printScore()
name: Jack
score: 90
但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。
总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。
如果外部代码要获取name和score,可以给Student类增加getName和getScore这样的方法:
class Student(object):
...
def getName(self):
return self.__name
def getScore(self):
return self.__score
如果要允许外部代码修改score,可以再给Student类增加setScore方法:
class Student(object):
...
def setScore(self,score):
self.__score=score
stu=Student('Bob',90)
stu.setScore(100)
stu.printName()
stu.printScore()
name: Bob
score: 100
你也许会问,原先那种直接通过stu.score = 99也可以修改啊,为什么要定义一个方法大费周折?因为在方法中,可以对参数做检查,避免传入无效的参数:
def setScore(self,score):
if 0<=score<=100:
self.__score=score
else:
raise ValueError('bad score')