访问控制

访问控制

访问控制指的是:控制类对象的属性和方法在类对象的外部是否可以直接访问

如果再类对象的某个属性和方法前添加两个下划线__,那么在类对象的外部就不能直接访问该属性和方法

#-*-coding:utf-8-*-
#@author    :vict
#@Time      :2020-4-1 22:47
#@File      :test1
#@software  :PyCharm
class Myclass(object):
    def __init__(self):
        self.__pia = 18

    def __pim(self):
        print("__pim被调用")

    def do_sth(self):
        print(self.__pia)
        self.__pim()

mc = Myclass()
# print(mc.__pia)# AttributeError: 'Myclass' object has no attribute '__pia'
# mc.__pim() # AttributeError: 'Myclass' object has no attribute '__pim'
mc.do_sth()
"""
之所以不能在类对象的外部直接访问以下划线开头的属性或方法,是因为:python解释器对外把
属性或方法__xxx改成了另外一个名字:_类名__xxx。所以,在类对象的外部仍然可以通过_类名__xxx
访问属性和方法__xxx。但是,强烈建议不要这样访问。因为不同版本的python解析器可能会把属性或方法
__xxx改成不同名字。
"""
print(mc._Myclass__pia)
print(mc._Myclass__pim())
# 调用内置函数dir()获得指定对象所有可以访问的属性和方法
print(dir(mc))
"""
仍然可以在类对象的外部动态绑定名为__XXX的属性或方法,这与类对象内部名为__xxx的属性和方法
是不同的
"""
mc.__pia = "Hi"
print(mc.__pia)

"""
除了在类对象的属性或方法前添加两个下划线__,还可以在类对象的属性或方法前添加单下划线_,
这表示:虽然可以在类对象的外部访问该属性或方法,但最好不要访问。
"""

class SomeClass(object):
    def __init__(self):
        self._pia = 18

    def _pim(self):
        print("_pim()被调用了")

sc = SomeClass()
print(sc._pia)
sc._pim()
posted @ 2020-04-05 17:01  不知云深处  阅读(454)  评论(0编辑  收藏  举报