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()