Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免在Python中意外地弄乱基类?_Python_Oop_Encapsulation - Fatal编程技术网

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

如何避免在Python中意外地弄乱基类?,python,oop,encapsulation,Python,Oop,Encapsulation,Python对私有变量使用下划线约定。但是,似乎没有什么可以阻止您在中意外地弄乱基类 class Derived(Base): def __init__(self, ...): ... super(Derived, self).__init__(...) ... self._x = ... if Base碰巧也使用了名称x 避免此类错误的最佳实践是什么 这似乎特别具有挑战性,如果不同的人实现了基类和派生类,或者在实现了派生

Python对私有变量使用下划线约定。但是,似乎没有什么可以阻止您在中意外地弄乱基类

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