Python对私有变量使用下划线约定。但是,似乎没有什么能阻止你不小心弄乱基类,例如
class Derived(Base):
def __init__(self, ...):
...
super(Derived, self).__init__(...)
...
self._x = ...
如果Base
也恰好使用名称_x
。
避免这种错误的最佳做法是什么?
如果不同的人实施了Base
和Derived
课程,或_x
在Base
实施后被添加到Derived
,那么这似乎特别具有挑战性(所以, Derived
的实现将追溯打破封装)
答案 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