zoukankan      html  css  js  c++  java
  • 封装之如何实现属性的隐藏

    class A:
    _s =1 #变形为 _A__s
    def __init__(self, name):
    self.__name = name #变形self. _A__name
    def __Foo(self): #_A__Foo(self)
    print('run to')
    def bar(self):
    self.__Foo() #self._A__Foo
    print('from __Foo')
    a = A('老王')
    a.bar()
    a._A__Foo()
    print(A.s)
    print(a.__name) #a.__dict__.[_A__name]
    print(a.__dict__)
    print(A._dict__)

    '''这种左边‘__’双下划线的操作的隐藏方式有啥特点?
    1,通过object.Attrname(隐藏的属性名字)是无法访问的到的
    2,但是在内部可以访问的到 如上在定义一个函数bar在函数bar内部调用隐藏函数__Foo
    在对象哪里调用bar结果可以成功打印‘from __Foo’
    3,子类无法覆盖父类的带'__'的属性的任何变量

    '''
    #对以上第三条证明:
    class Foo:
    def __func(self): #_Foo__func
    print('老王吃屎')
    class Bar(Foo):
    pass
    # def __func(self): #_Bar__func
    # print('老王的媳妇出轨啦')
    a = Bar()
    a._Foo__func()



    #这种变形需要注意的是:
    #1,:print(_类名__被影藏的函数属性)
    #2:如果需要隐藏属性名字,必须在类的定义的时候就隐藏如果类已经定义完成
    #再给类添加隐藏属性则无法创建
    class A:
    __ss = 4
    def __func(self):
    print('老王的媳妇真好看')
    s = A()
    s.__dd = 5 #这里定义了隐藏属性但是它并非隐藏,
    print(s.__dd)#用原始的打印方式依然可以访问的到

    # 如果加用'__',dd.bar()执行时在自己的对象和类里面都没有找到会去父类里找,父类找到时又
    # 执行foo 此时如果foo换成__foo,程序就不会去自己的类或者对象里面找,而是在自己所在的类
    # 里面 找并且执行
    class B:
    def __foo(self): #_B__foo
    print('from B foo')
    def bar(self):
    self.__foo() #self._B__foo
    print('from bar')
    class C(B):
    def foo(self): #_C__foo
    print('from C foo')
    dd = C()
    dd.bar()
  • 相关阅读:
    LeetCode5 Longest Palindromic Substring
    LeetCode4 Median of Two Sorted Arrays
    LeetCode3 Longest Substring Without Repeating Characters
    LeetCode2 Add Two Numbers
    LeetCode1 Two Sum
    算法总结—深度优先搜索DFS
    c++ 设计模式9 (Abstract Factory 抽象工厂模式)
    题解 P3374 【【模板】树状数组 1】
    题解 HDU1565 【方格取数(1)】
    题解 P2431 【正妹吃月饼】
  • 原文地址:https://www.cnblogs.com/yuexijun/p/10247333.html
Copyright © 2011-2022 走看看