面向对象编程-访问限制

外部代码可以通过实例变量来操作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__这样的变量名

posted @ 2023-06-15 13:43  鹿丸子  阅读(48)  评论(0)    收藏  举报