• 面向对象之隐藏属性(访问限制机制)


    TOC

    隐藏属性(访问限制机制)

    Python的Class机制采用双下划线开头的方式将属性隐藏起来(设置成私有的),但其实这仅仅只是一种变形操作,类中所有的双下划线开头的属性都会在类定义阶段,检测语法时自动变成_类型__属性名的形式:

    • 这种隐藏只是一种语法上变形操作,并不会将属性真正隐藏起来
    • 这种语法级别的变形,是在定义阶段发生的,并且只在定义阶段发生,在定义类之后的赋值操作,不会变形
    • 在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。
    class A:
        def __func(self): # _A__func(self)
            print('from A.__func')
    
        def test(self): # self ---> b_obj
            # b_obj.__func()
            self.__func() # self._A__func()
            # 此处执行的b_obj.__func()其实是在执行b_obj._A_fun()
    
    
    class B(A):
    
        def __func(self): # self._B__func(self)
            print('from B.__func')
    
    
    b_obj = B()
    b_obj.test()
    
    >>> from A.__func

    一、如何实现

    class User:
        # __开头的属性
        __name = 'tank'  # __name变形为:_类名__name
    
        # __开头的方法
        def __run(self):
            print('tank is running....')
    
    
    obj = User()
    print(obj.__name)
    # 报错,没有找到
    NameError: name '__name' is not defined
    
    print(obj._User__name)
    # 没有报错
    tank

    二、什么是访问限制机制

    凡是在内部定义的以__开头的属性和方法名,都会被限制,外部不能直接访问改属性

    注意: 凡是在类内部定义__开头的属性或方法,都会变形为 _类名__属性/方法。(python特有的)

    三、为什么要有访问限制

    比如:将一些隐私的数据,隐藏起来,不让外部轻易获取

    • 接口
      • 可以将一堆数据封装成一个接口,可以让用户去调用接口
      • 并且通过相应的逻辑,最后再将数据返回个用户

    范例代码:

    class User:
        __name = 'tank'
        __age = 17
        __sex = 'male'
        __ID = '234245353425345'
        __balance = '1132432'
    
        # 校验接口,获取用户信息
        def parse_user(self, username, password):
            if username == 'tank_jam' and password == '123':
                print(f'''
                通过验证,获取用户信息
                姓名:{self.__name}
                年龄:{self.__age}
                性别:{self.__sex}
                身份证ID:{self.__ID}
                用户资产:{self.__balance}
                ''')
            else:
                print('校验失败,无法查询用户信息!')
    
    
    obj = User()
    obj.parse_user('tank_jam', '123')




  • 相关阅读:
    高兴啊~~新博皮诞生咯~~
    不同的手机用户被表现
    这是荷塘月色另外的一种风格代码,要的拿。。。。记得禁止默认CSS
    开始做新博皮!@
    哎,回来拉
    漂亮!正常咯~~!~
    郁闷,垃圾CSS!
    新开始,新起航。。
    Debug!Debug!Debug!
    Dubbo源码学习总结系列一 总体认识
  • 原文地址:https://www.cnblogs.com/cnhyk/p/11944827.html
Copyright © 2020-2023  润新知