如何避免在Python中意外搞乱基类?

时间:2016-07-16 14:39:34

标签: python oop encapsulation

Python对私有变量使用下划线约定。但是,似乎没有什么能阻止你不小心弄乱基类,例如

class Derived(Base):
    def __init__(self, ...):
        ...
        super(Derived, self).__init__(...)
        ...
        self._x = ...

如果Base也恰好使用名称_x

避免这种错误的最佳做法是什么?

如果不同的人实施了BaseDerived课程,或_xBase实施后被添加到Derived,那么这似乎特别具有挑战性(所以, Derived的实现将追溯打破封装)

1 个答案:

答案 0 :(得分:4)

使用private variables with two underscores。通过这种方式,名称修改可以防止弄乱您的父类(正常用例中的 )。

  

由于类私有成员有一个有效的用例(即为了避免名称与子类定义的名称冲突),对这种称为名称修改的机制的支持有限。形式__spam的任何标识符(至少两个前导下划线,最多一个尾随下划线)在文本上用_classname__spam替换,其中classname是当前类名,其中前导下划线被剥离。只要它出现在类的定义中,就可以在不考虑标识符的句法位置的情况下完成这种修改。

     

[...]请注意,修剪规则主要是为了避免事故;它仍然可以访问或修改被认为是私有的变量。这在特殊情况下甚至可能很有用,例如在调试器中。

示例

class A(object):
    def __init__(self):
        self.__v = 1
    def __str__(self):
        return "A = {}".format(self.__v)

class B(A):
    def __init__(self):
        A.__init__(self)
        self.__v = 2
    def __str__(self):
        return "{}; B = {}".format(A.__str__(self), self.__v)

a = A()
b = B()
print(a)
print(b)

产量

A = 1
A = 1; B = 2