betrachten den folgenden Code:Können private Python-Variablen auch geändert werden, ohne object._className__attributeName zu verwenden?
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)
Die Ausgabe lautet:
A B
C D
Ich verstehe, dass Python private Variablen nur durch Konvention geschützt sind. Aber alle anderen Threads erwähnen ._className__attributeName zB. terrier._dog__owner als einzige Möglichkeit, variable Werte zu ändern. Hier kann ich sie sogar mit terrier.owner oder terrier.name ändern.
Seltsamerweise geben beide einen anderen Ausgang wie oben gezeigt. So erstellen terrier.owner oder terrier.name verschiedene Instanzen von terrier._dog__name oder terrier._animal__name? Was genau ist hier passiert?
Ja. In Python gibt es keine privaten Attribute. –
Ja, "terrier.owner" ist ein anderer Name als "terrier._dog__owner". Warum würdest du anders denken? Es ist nicht anders als 'terrier.blah = "foo" 'zu machen. Sie können beliebige Attribute erstellen, die Sie möchten. – BrenBarn
Danke, aber können Sie erklären, warum die beiden getrennten Instanzen von Objektterrier erstellt werden, die zwei verschiedene Sätze von Ausgängen ergeben? –