python类的访问可见性问题

在很多面向对象编程语言中,我们通常会将对象的属性设置为私有的(private)或受保护的(protected),简单的说就是不允许外界访问,而对象的方法通常都是公开的(public),因为公开的方法就是对象能够接受的消息。在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头。
但是,Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来妨碍对它们的访问,事实上如果你知道更换名字的规则仍然可以访问到它们,下面的代码就可以验证这一点。之所以这样设定,可以用这样一句名言加以解释,就是"We are all consenting adults here"。因为绝大多数程序员都认为开放比封闭要好,而且程序员要自己为自己的行为负责。

class Test:
    def __init__(self, name, age):
        #name为公开
        self.name = name
        #__age 为私有
        self.__age = age
    def play_game(self):
        print('%s可以打游戏。'%(self.name))
    
    def __study(self):
        print('这是在__study函数下打印的')
        print('#'*10)
        print('年龄是:',self.__age)

test = Test('张三', 18)
test.play_game()
print(test.name)
#print(test.__age) # 报错AttributeError: 'Test' object has no attribute '__age'
print(test._Test__age) #可以访问到 18
#test.__study() #AttributeError: 'Test' object has no attribute '__study'
test._Test__study() #可以访问到

在实际开发中,我们并不建议将属性设置为私有的,因为这会导致子类无法访问(后面会讲到)。所以大多数Python程序员会遵循一种命名惯例就是让属性名以单下划线开头来表示属性是受保护的,本类之外的代码在访问这样的属性时应该要保持慎重。这种做法并不是语法上的规则,单下划线开头的属性和方法外界仍然是可以访问的,所以更多的时候它是一种暗示或隐喻。

你可能感兴趣的:(python类的访问可见性问题)