Python中的私人成员


问题内容

如何在Python中将方法和数据成员设为私有?还是Python不支持私有成员?


问题答案:

9.6。 私有变量

只能从对象内部访问的“私有”实例变量在Python中不存在。但是,大多数Python代码遵循一个约定:以下划线开头的名称(例如_spam)应被视为API的非公开部分(无论是函数,方法还是数据成员)
。它应被视为实现细节,如有更改,恕不另行通知。

由于存在类专用成员的有效用例(即避免名称与子类定义的名称发生名称冲突),因此对这种称为名称处理的机制的支持有限。形式为__spam的任何标识符(至少两个前导下划线,至多一个下划线)在文本上被替换为_classname__spam,其中classname是当前的类名,其中前导下划线被去除。只要不存在标识符的语法位置,就可以进行这种改写,只要它出现在类的定义内即可。

因此,例如

class Test:
    def __private_symbol(self):
        pass
    def normal_symbol(self):
        pass

print dir(Test)

将输出:

['_Test__private_symbol', 
'__doc__', 
'__module__', 
'normal_symbol']

__private_symbol应该被视为私有方法,但仍可以通过访问_Test__private_symbol