如何避免在Python中意外地弄乱基类?
Python对私有变量使用下划线约定。但是,似乎没有什么可以阻止您在中意外地弄乱基类如何避免在Python中意外地弄乱基类?,python,oop,encapsulation,Python,Oop,Encapsulation,Python对私有变量使用下划线约定。但是,似乎没有什么可以阻止您在中意外地弄乱基类 class Derived(Base): def __init__(self, ...): ... super(Derived, self).__init__(...) ... self._x = ... if Base碰巧也使用了名称x 避免此类错误的最佳实践是什么 这似乎特别具有挑战性,如果不同的人实现了基类和派生类,或者在实现了派生
class Derived(Base):
def __init__(self, ...):
...
super(Derived, self).__init__(...)
...
self._x = ...
if Base碰巧也使用了名称x
避免此类错误的最佳实践是什么
这似乎特别具有挑战性,如果不同的人实现了基类和派生类,或者在实现了派生类之后将x添加到基类中,那么派生类的实现将追溯性地打破封装使用。这样,名称损坏保护您在正常使用情况下不会弄乱父类
由于类私有成员有一个有效的用例,即避免名称与子类定义的名称发生名称冲突,因此对这种称为名称混乱的机制的支持有限。格式为uuu spam的任何标识符至少有两个前导下划线,最多一个尾随下划线以文本形式替换为u classname uuuuu spam,其中classname是当前类名,前导下划线已去除。只要标识符出现在类的定义中,就可以在不考虑标识符的语法位置的情况下进行修改
[…]注意,撕碎规则的设计主要是为了避免事故;仍然可以访问或修改被视为私有的变量。这甚至可以在特殊情况下使用,例如在调试器中
范例
屈服
A = 1
A = 1; B = 2
据我所知,您仍然可以通过使用变量的损坏名称来访问变量,因此它不像Java中的私有变量那样健壮;仍然可以访问或修改被视为私有的变量。这甚至可以在特殊情况下使用,例如在调试器中。我将把这一点补充到我的答案中。
A = 1
A = 1; B = 2