Python-访问控制“__”和“_”

  1. 访问控制“__”和“_”

访问控制“__”和“_”

访问控制指的是:控制类对象的属性和方法在类对象的外部是否可以直接访问。
如果在类对象的某个属性或方法前添加两个下划线__,那么在类对象的外部就不能直接访问该属性或方法了。

#!/usr/bin/python3


class MyClass(object):
    def __init__(self):
        self.__name = 'Hehe'

    def __get_name(self):
        print('__get_name() 被调用了')

    def get_name(self):
        print('name:', self.__name)


mc = MyClass()

print(mc.__name)   # AttributeError: 'MyClass' object has no attribute '__get_name'

mc.__get_name()    # AttributeError: 'MyClass' object has no attribute '__get_name'

mc.get_name()      # name: Hehe   

之所以不能在类对象的外部直接访问以__开头的属性或方法,是因为python解释器把属性或方法__xxx改成了另一个名字:_类名__xxx。所以在类对象的外部仍然可以通过_类名__xxx访问属性或方法。但是,强烈建议不要这样访问,因为不同版本的python解释器可能会把属性或方法__xxx改成不同的名字。

#!/usr/bin/python3


class MyClass(object):
    def __init__(self):
        self.__name = 'Hehe'

    def __get_name(self):
        print('__get_name() 被调用了')

    def get_name(self):
        print('name:', self.__name)


mc = MyClass()

print(mc._MyClass__name)

mc._MyClass__get_name()

mc.get_name()
[root@lyucan ~]# ./10.py
Hehe
__get_name() 被调用了
name: Hehe

我们仍然可以在类对象的外部动态的绑定名为__xxx的属性或方法,这与类对象内部名为__xxx的属性或方法是不同的,动态添加的名为__xxx的方法是可以在外部被访问的。

#!/usr/bin/python3


class MyClass(object):
    def __init__(self):
        self.__name = 'Hehe'

    def __get_name(self):
        print('__get_name() 被调用了')

    def get_name(self):
        print('name:', self.__name)


mc = MyClass()

mc.__age = 18

print(mc.__age)
[root@lyucan ~]# ./10.py
18

除了在类对象的属性或方法前添加两个下划线__,还可以在类对象的属性或方法前添加单下划线_

为了在某种程度上实现模块内的数据访问控制,可以在模块内的某些属性前添加单下划线_,这样,就无法使用语句from 模块名 import *导入相应的属性了,但是,使用语句import 模块名仍然可以导入相应的属性。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com