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