2013-02-24 106 views
5

我想在Python 3.2中设置具有“受保护”访问权限的类层次结构:基类的成员仅在派生类的范围内,但不在“公共”范围内。Python中的“受保护”访问 - 如何?

双下划线使会员成为'私人',单个下划线表示警告,但会员保持'公开'。什么(如果有...)是指定“受保护”成员的正确语法。

+6

不可以。使用'_single_underscore'约定,并开心。 – JBernardo 2013-02-24 06:42:32

回答

8

Python中的成员访问权限由“协商”和“条约”进行,而不是强制执行。

换句话说,你班上的用户应该把他们的手从他们的业务中解脱出来,但除了我使用的_xxx标识符之外,你不能强制执行这些标识符,这使得他们的访问(通常)不适合。

+0

所以这是不可能的。好。但是,我确实遇到过无数次“条约”而不是“强制”的问题:访问说明符背后的想法并不是真的阻止其他人做出某些事情。这是关于清晰,结构化的代码组织。我希望我的语言能够帮助我做到这一点,不会留下任何类似疯狂黑客的开头,这在我经常看到的Python代码中都很常见。 (表明我可能不应该使用Python ...) – Vector 2013-02-24 08:17:12

3

双下划线不会在C++或Java意义上使会员成为'私人' - Python完全避免了这种语言强制的访问规则。一个单个下划线按照惯例将一个属性或方法标记为“实现细节” - 也就是说,外面的东西仍然可以实现,但这不是类接口的支持部分,因此,类可能对不变量或后退/前向兼容性的保证不再适用。这以不同的方式解决了与“私人”(界面和实施分离)相同的概念问题。

双下划线调用名字改编这还不是“私人” - 它只是一个上面,由此略强配方: - 这个函数是这个类的实现细节, - 子类可能合理期望具有相同名称的方法意味着作为原

的重写版本这需要的语言支持一点点,从而使__name的错位,以包括类的名称 - 以便它的子类版本获得不同的名称而不是重写。如果子类或外部代码真的想要调用该方法,那么它仍然很有可能 - 并且名称修改的目标明确为而不是以防止这种情况发生。

的,因为这一切不过,“保护”被证明不是太大的意义在Python - 如果你真的有可能打破不变除非子类调用(和方法,实事求是,你可能不要即使你认为你也这么做),Python方法只是为了记录它。在你的文档字符串中加上一个注释,说明“假定只能由子类调用”,并假设客户会做正确的事情 - 因为如果他们不这样做,这就成为他们自己的问题。

+0

'双重下划线在C++或Java意义上不会成为'私有'......' - 理解。这就是为什么用引号说'私人'。但谢谢你的复习。 – Vector 2013-02-24 08:11:02