封装之如何实现属性的隐藏

Posted yuexijun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装之如何实现属性的隐藏相关的知识,希望对你有一定的参考价值。

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






























































以上是关于封装之如何实现属性的隐藏的主要内容,如果未能解决你的问题,请参考以下文章

python面向对象三大特性之封装

面向对象之封装,继承,多态的理解

封装之如何隐藏对象及封装的意义

面向对象之封装和继承

什么是封装,封装如何使用

什么是封装,封装如何使用