我想在Python 3.2中使用' protected'设置一个类层次结构。 access:基类的成员只在派生类的范围内,但不在' public'。
双下划线使会员成为私人',单个下划线表示警告,但该成员仍然是公共'。什么(如果有的话)是用于指定受保护的'的正确语法。构件。
答案 0 :(得分:8)
Python中的成员访问权限是通过“协商”和“条约”来实现的,而不是通过武力。
换句话说,你班级的用户应该放弃那些不属于他们业务的东西,但你不能强制执行除我使用_xxx
标识符之外的其他标识,以便明确表明他们的访问权限(通常)不合适。
答案 1 :(得分:3)
双下划线不会使成员'私有'在C ++或Java意义上 - Python非常明确地避开了那种语言强制的访问规则。按照惯例,单个下划线将属性或方法标记为“实现细节” - 也就是说,外部的东西仍然可以到达它,但这不是该类的受支持部分接口,因此,类可能对不变量或后向/向前兼容性所做的保证不再适用。这以不同的方式解决了与“私有”(接口和实现的分离)相同的概念问题。
双下划线调用仍然不是“私有”的名称重整 - 它只是上面稍微强一些的表述,其中: - 此函数是此类的实现细节,但 - 子类可能合理地期望有一个同名的方法,不是意味着原始的被覆盖版本
这需要一些语言支持,其中__name
被修改为包含类的名称 - 因此它的子类版本获得不同的名称而不是覆盖。如果子类或外部代码确实需要调用该方法,那么它仍然很有可能 - 并且名称修改的目标是明确地而不是来阻止它。
但是由于所有这些,'protected'在Python中没有多大意义 - 如果你真的有一个方法可以打破不变量,除非被子类调用(实际上,即使你认为你也可能不这样做),Python方法就是记录它。在你的docstring中添加一个注释,使其“假定只能由子类调用”,并假设客户端会做正确的事情 - 因为如果不这样做,那就成了他们自己的问题。