【发布时间】:2016-03-25 18:32:25
【问题描述】:
考虑以下代码:
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 创建不同的实例?这里到底发生了什么?
【问题讨论】:
-
是的。 Python 中没有私有属性。
-
是的,
terrier.owner与terrier._dog__owner的名称不同。为什么你会有其他想法?这和terrier.blah = "foo"没什么区别。你可以创建任何你想要的属性。 -
谢谢,但您能解释一下为什么要创建两个不同的对象梗实例,它们会提供两组不同的输出吗?
-
@AnanyaChandra:你没有创建两个单独的实例..
-
@AnanyaChandra:你所做的只是添加额外的属性。它们与双下划线属性独立。