访问控制“__”和“_”
访问控制指的是:控制类对象的属性和方法在类对象的外部是否可以直接访问。
如果在类对象的某个属性或方法前添加两个下划线__
,那么在类对象的外部就不能直接访问该属性或方法了。
#!/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