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()
原文地址:https://www.cnblogs.com/yuexijun/p/10247333.html
时间: 2024-11-01 15:49:35