python 私有变量甚至可以在不使用 object._className__attributeName 的情况下更改吗?

Can python private variables even be changed without using object._className__attributeName?

考虑以下代码:

class animal:
    def __init__(self, name):
        self.__name = name

class dog(animal):
    def __init__(self, owner, name):
        self.__owner = owner
        super(dog, self).__init__(name)

terrier = dog('A', 'B')
terrier.owner = 'C'
terrier.name = 'D'
print(terrier._dog__owner, terrier._animal__name)
print(terrier.owner, terrier.name)

输出为:

A B
C D

我了解 Python 私有变量仅受约定保护。但是所有其他线程都提到 ._className__attributeName 例如。 terrier._dog__owner 作为改变变量值的唯一方式。在这里,我什至可以使用 terrier.owner 或 terrier.name.

来改变它们

奇怪的是,两者都给出了不同的输出,如上所示。那么 terrier.owner 或 terrier.name 从 terrier._dog__name 或 terrier._animal__name 创建不同的实例吗?这里到底发生了什么?

双下划线变量确实不是私有的 Java 或 C++ 看待隐私的方式。它们不应该被视为对 class 之外的代码私有。它们用于 避免子 class 和 之间的名称冲突,这就是 class 名称用作前缀的原因。

例如当你有一个 class Foo 的内部实现,并且你不希望 subclass Bar(Foo) 在它们的实现中不小心使用相同的名称,你可以使用属性 __spam,将分别转换为 _Foo__spam_Bar__spam,因此不会发生冲突。

您添加的terrier.ownerterrier.name属性是独立的,与_dog__owner_animal__name无关您的 classes 使用的属性。使用双下划线变量名不会阻止创建其他属性,包括不带下划线的相同名称。