类属性和方法的访问控制
控制类对象的属性和方法在类对象外部是否可以直接访问。
在属性或方法前加两个下划线__,那么这个属性就不能从外部访问。
# 私有变量和私有方法
class Animal(object):
def __init__(self, name):
self.name = name
__qq = 123123
def __print_qq(self):
print(self.__qq)
def print_qq(self):
print(self.__qq)
dog = Animal('dog')
dog.print_qq() # 可以输出
dog.__print_qq() # AttributeError: 'Animal' object has no attribute '__print_qq'
dog.__qq() # AttributeError: 'Animal' object has no attribute '__qq'
之所以不能在类对象的外部直接访问以双划线开头的属性和方法,是因为python解析器对外把属性或方法__xxx改成了另外一个名字:_类名__xxx
而在外部动态绑定一个__开头的属性或方法,与在类中定义的是不同的,不会被python解析器转换,可以直接调用。
# 在外部绑定__属性,不会转换
class Animal(object):
def __init__(self, name):
self.name = name
__qq = 123123
dog = Animal('dog')
dog.__ww = 456456
print(dog.__ww) # 可以输出
print(dog.__qq) # AttributeError: 'Animal' object has no attribute '__qq'
_xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问,也表明最好不要通过外部访问。
若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入 。