面向对象编程-访问限制
外部代码可以通过实例变量来操作class里面的数据,外部代码还可以修改实例的属性:
点击查看代码
bart = Student('Bart Simpson', 59)
bart.score
>>59
bart.score = 99
bart.score
>>99
如果要让外部属性不被外部访问,可以在属性名称前加两个下划线__,若实例的变量名以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,实际上只是被Python解释器自动改成了_Student__name
点击查看代码
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
bart = Student('Bart Simpson', 59)
bart.__name
>>>Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'
这样做确保了外部代码不能随意修改对象内部的状态,使代码更健壮
若外部代码要想获取name和score,可以定义get方法,再return这个属性
点击查看代码
class Student(object):
...
def get_name(self):
return self.__name
def get_score(self):
return self.__score
修改则可以定义set方法,让属性的值等于传进去的参数的值
点击查看代码
class Student(object):
...
def set_score(self, score):
self.__score = score
↑这样做还可以给传进的参数加一个校验:
点击查看代码
class Student(object):
...
def set_score(self, score):
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('bad score')
双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名