面向对象之类的私有属性和方法
类的属性具有怎样的访问权限(也称为可见性)? 在很多面向对象编程语言中,通常会将属性设置为私有的(private)或受保护的(protected),不允许外界访问,而方法通常都是公开的(public)。而在Python中,属性和方法的访问权限只有两种:公开的和私有的。如果希望是私有的,在命名时可以用两个下划线作为开头。
但是,Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有属性和方法换了一个名字来“妨碍”对它们的访问,事实上如果你知道更换名字的规则仍然可以访问到它们。之所以这样设定,可以用这样一句名言加以解释,就是“We are all consenting adults here”。因为绝大多数程序员都认为开放比封闭要好,而且程序员要自己为自己的行为负责。
在实际开发中,我们并不建议将属性设置为私有的,因为这会导致子类无法访问。所以大多数Python程序员会遵循一种命名惯例就是让属性名以单下划线开头来表示属性是受保护的,本类之外的代码在访问这样的属性时应该要保持慎重。这种做法并不是语法上的规则,单下划线开头的属性和方法外界仍然是可以访问的,所以更多的时候它是一种暗示或隐喻。
类的私有属性
__privateattrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用是self.__privateattrs。
类的私有方法
__privatemethods(self):两个下划线开头,声明该方法为私有,不能在类的外部调用。在类内部的方法调用是self.__privatemethods()。
代码示例
class JustCounter:
__secretCount = 0 #私有属性,前缀两个下划线
publicCount = 0
def count(self):
self.__secretCount += 1 #类内部调用私有属性
self.publicCount += 1
print self.__secretCount
def __print1(self): #私有方法,前缀两个下划线
print 'This is a private method!'
def print2(self):
self.__print1() #类内部调用私有方法
counter = JustCounter()
print counter.publicCount
#print counter.__secretCount # 报错,实例不能访问私有属性
print counter._JustCounter__secretCount #可以通过( 对象名._类名__私有属性名 )访问私有属性
counter.count()
#counter.__print1() # 报错,实例不能访问私有方法
counter._JustCounter__print1() #可以通过( 对象名._类名__私有方法名 )访问私有方法
counter.print2()
输出:
0
0
1
This is a private method!
This is a private method!