zoukankan      html  css  js  c++  java
  • 访问权限

    访问权限分为私有和公开
    公开的访问权限就是类的内部和外部都可以访问
    私有的访问权限就是只有内部可以访问,外部不能访问,如果要想访问,则需通过类内定义的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

  • 相关阅读:
    CodeForces 156B Suspects(枚举)
    CodeForces 156A Message(暴力)
    CodeForces 157B Trace
    CodeForces 157A Game Outcome
    HDU 3578 Greedy Tino(双塔DP)
    POJ 2609 Ferry Loading(双塔DP)
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛十六进制转换成十进制
  • 原文地址:https://www.cnblogs.com/shiliye/p/10954616.html
Copyright © 2011-2022 走看看