码迷,mamicode.com
首页 > 其他好文 > 详细

访问权限

时间:2019-05-31 13:13:09      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:包含   xxxx   new   turn   ret   div   权限   名称   访问权限   

访问权限分为私有和公开
公开的访问权限就是类的内部和外部都可以访问
私有的访问权限就是只有内部可以访问,外部不能访问,如果要想访问,则需通过类内定义的get和set方法获取和修改属性值
这样就确保了外部代码不能随意修改对象内部的状态,如在set方法里加入判断逻辑,可确保set值符合规定,这样通过访问限制的保护,代码更加健壮

 

创建包含私有属性的类

class Student(object):

    def __init__(self, name, score):
        #如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__
        #在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
        self.__name = name
        self.__score = score

    def print_score(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:
            raise ValueError(bad score)
        
bart = Student(Bart Simpson, 59)

print(bart.__name)    #报错,因为__name是私有的,外部不能直接访问
print(bart.get_name())    #输出:Bart Simpson,通过自定义的get方法获取name属性
print(bart.get_score() )   #输出:59,通过自定义的get方法获取score属性
bart.set_score(70)   #通过set方法修改score属性
print(bart.get_score())    #输出:70

bart.__name = New Name#该__name属性与内部私有属性__name不是同一个属性,内部的__name实际上是_Student__name,实际上该操作是为实例绑定了一个新的属性__name
print(bart.__name)    #输出:New Name
print(bart._Student__name)   #输出:Bart Simpson
bart.get_name()    #输出:Bart Simpson,输出的实际是内部私有属性_Student__name变量的值    

注意:
  1) 属性名格式为__xxxx__的,表示特殊变量而不是私有变量,它是可以被外部直接访问的,所以私有属性的格式必须是__xxxx
  2) 属性名格式为_xxxx的,它是可以被外部直接访问的,但根据惯例,请将其视为私有变量,不要随意访问
  3) 属性名格式为__xxxx的,它虽然是内部私有属性,但也并非一定不能访问,不能直接访问是因为Python解释器对外把__xxx变量改成了_类名__xxxx(如_Student__name)
   所以可通过_类名__xxxx来访问内部私有属性__xxxx,但强烈建议这样做,因为不同版本的Python解释器可能会把__xxx改成不同的变量名
   总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉
  4) 外部访问__xxxx,如:实例名.__xxxx = ‘....‘,实际上访问的不是内部私有属性__xxxx(内部私有属性其实是:_类名__xxxx),而是绑定了一个新的公开属性__xxxx

 

访问权限

标签:包含   xxxx   new   turn   ret   div   权限   名称   访问权限   

原文地址:https://www.cnblogs.com/shiliye/p/10954616.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!