FreezeJ' Blog

python类属性和方法的访问控制

2019-04-28

类属性和方法的访问控制

控制类对象的属性和方法在类对象外部是否可以直接访问。
在属性或方法前加两个下划线__,那么这个属性就不能从外部访问。

# 私有变量和私有方法
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”时,不会将以一个下划线开头的对象引入 。

Tags: Python