请帮我理解Python对象实例化。

4

我不是程序员,但目前正在学习Python。但是我对对象实例化感到有些困惑。我认为类就像一个模板,对象是基于这个模板生成的(或者实例化的)。这是否意味着一旦对象被创建(例如classinst1 = MyClass()),模板中的更改不应影响对象中的内容?

此外,下面的代码显示我可以更改类变量“common”,但前提是我没有将新值分配给对象中的“common”变量。 如果我在我的对象中分配了“common”的新值(比如classinst1.common = 99),那么更改我的类变量“common”不再影响classinst.common的值吗?

请问有人能够为我澄清下面的代码为什么会表现出这样的方式吗?这是所有OO语言都普遍存在的问题还是Python中的一种古怪方面?

===============

>>> class MyClass(object):
...     common = 10
...     def __init__(self):
...             self.myvar=3
...     def myfunction(self,arg1,arg2):
...             return self.myvar
... 
>>> classinst1 = MyClass()
>>> classinst1.myfunction(1,2)
3
>>> classinst2 = MyClass()
>>> classinst2.common
10
>>> classinst1.common
10
>>> MyClass.common = 50
>>> classinst1.common
50
>>> classinst2.common
50
>>> classinst1.common = 99
>>> classinst2.common
50
>>> classinst1.common
99
>>> MyClass.common = 7000
>>> classinst1.common
99
>>> classinst2.common
7000

如果类中的变量没有self前缀,那么它就是该类所有实例共有的,这是非常普遍的。 - bwbrowning
1个回答

7
您对类的声明和实例化有了基本的理解。但是您的示例输出似乎没有意义的原因在于,实际上有两个名为common的变量。第一个是在代码顶部的类声明中声明和实例化的类变量。这是大多数示例中唯一的common变量。
当您执行这行代码时:
classinst1.common = 99

您正在创建一个对象变量,这是classinst1的成员。由于它与类变量具有相同的名称,因此它会遮蔽或隐藏MyClass.common。现在所有对classinst1.common的引用都指向该对象变量,而所有对classinst2.common的引用仍然回退到MyClass.common,因为没有名为common的对象变量是classinst2的成员。

因此,当您执行以下操作时:

MyClass.common = 7000

这将改变 MyClass.common ,但 classinst1.common 仍然等于99.在您示例的最后几行中,当您询问解释器 classinst1.common classinst2.common 的值时,前者指的是 classinst1 对象成员变量 common ,而后者指的是类变量 MyClass.common


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接