在其它的编程语言中,一般都有对属性的访问控制,而在python并没有这一特性,那么我们应该如何应对这个问题?
常用的做法如下:
class A:
def __init__(self):
self._internal = 0
self.public = 1
def public_method(self):
pass
def _internal_method(self):
pass
第一个规则就是我们在任何以下划线开头的名字应该总认为被内部实现,python本身并不会去阻止他人的访问,但是如果这样做了,可能会导致脆弱的代码。
有时我们见过以双下划线开头的名称,如下:
class B:
def __init__(self):
self.__private = 0
def __private_method(self):
pass
def public_method(self):
self.__private_method()
这样的简单处理,可以对暴露共有方法,隐藏私有方法,那么这个以双下划线开头的属性有哪些行为,目的是什么?
在python中会对以双下划线开头的名称进行名称重整行为,具体来说就是会将上面的类的私有属性分别重命名为:_B__private, _B_private__method。那么这样命名的目的何在?
是为了继承而存在的,这样的属性不能通过继承而覆盖。
class C(B):
self.__private = 1
def __private_method(self):
...
因为这里带双下划线的私有名称都会被重新命名为_C__private和_C__private__method,这和基类B中的重整名称不一样,所以这个只是属于C类的私有方法。