Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。

 

但是,从Student类的定义来看,外部代码还是可以自由地修改一个实例的namescore属性:

 

class Student(object):

    def __init__(self,name,score):

        self.name = name

        self.score = score

bart = Student('Bart Simpson',59)

bart.score = 99

print(bart.score)

 

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__

 

Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

 

class Student1(object):

    def __init__(self,name,score):

        self.__name = name

        self.__score = score

 

 

    def print_socre(self):

        print('%s:%s'%(self.__name,self.__score))

peter = Student1('Peter', 78)

print(peter.__name)

 


访问会报错

 

当外部代码想要获取amescore,可以给Student类增加get_nameget_score这样的方法

 

class Student2(object):

    def __init__(self,name,score):

        self.__name = name

        self.__score = score

 

    def print_socre(self):

        print('%s:%s'%(self.__name,self.__score))

 

    def get_name(self):

        return self.__name

 

    def get_score(self):

        return self.__score

kael = Student2('kael',99)

print(kael.get_name())

print(kael.get_score())

 

如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:

 

class Student3(object):

    def __init__(self,name,score):

        self.__name = name

        self.__score = score

 

    def print_socre(self):

        print('%s:%s'%(self.__name,self.__score))

 

    def get_name(self):

        return self.__name

 

    def get_score(self):

        return self.__score

 

    def set_score(self,score):

        if 0 < score <100:

            self.__score = score

        else:

            return ValueError('bad score')

Anna = Student3('Anna',78)

print(Anna.get_score())

Anna.set_score(88)

print(Anna.get_score())

 

这样可以在set()方法中校验给出的数据是否是我们想要的,而不是随便传的

 

需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量

 

练习

请把下面的Student对象的gender字段对外隐藏起来,用get_gender()set_gender()代替,并检查参数有效性:

 

class Student(object):

    def __init__(self, name, gender):

        self.name = name

        self.gender = gender

 

class Student4(object):

    def __init__(self, name, gender):

        self.name = name

        self.__gender = gender

    def get_gender(self):

        return self.__gender

    def set_gender(self,gender):

        self.__gender = gender

bart = Student4('Bart', 'male')

if bart.get_gender() != 'male':

    print('测试失败!')

else:

    bart.set_gender('female')

    if bart.get_gender() != 'female':

        print('测试失败!')

    else:

        print('测试成功!')