当我在Python中实例化类时会发生什么?

时间:2010-05-05 06:39:21

标签: python variables class

你能澄清Python类和类实例背后的一些想法吗?

考虑一下:

class A():
    name = 'A'

a = A()

a.name = 'B' # point 1 (instance of class A is used here)

print a.name
print A.name

打印:

B
A

如果改为point 1我使用类名,则输出不同:

A.name = 'B' # point 1 (updated, class A itself is used here)

打印:

B
B

即使Python中的类是类实例的某种原型,我也希望已创建的实例保持不变,即输出如下:

A
B

你能解释一下实际发生了什么吗?

3 个答案:

答案 0 :(得分:4)

首先,Python中创建实例字段(而不是类字段)的正确方法是使用__init__方法。我相信你已经知道了。

Python不会限制您为对象的非声明字段赋值。例如,请考虑以下代码:

class Empty: pass
e = Empty()
e.f = 5
print e.f # shows 5

所以代码中的内容是:

  1. 您使用分配有A的静态字段name创建了课程A
  2. 您创建了Aa
  3. 的实例
  4. 您为对象a创建了一个新字段(但不是A的其他实例),并为其分配B
  5. 您打印a.name的值,该值对象a是唯一的。
  6. 您打印属于类
  7. 的静态字段A.name的值

答案 1 :(得分:1)

答案 2 :(得分:1)

也许这个例子可能会让事情更有助于澄清。回想一下,Python名称不是存储(因为变量是在其他语言中),而是对存储的引用。您可以使用id(名称)找到名称所指的内容。身份运算符x is y告诉两个名称是否指向同一个对象。

>>> class A(object):
...     name = 'A'
... 
>>> x = A()
>>> A.name is x.name
True
>>> x.name = 'fred'  # x.name was bound to a new object (A.name wasn't)
>>> A.name is x.name
False
>>> x = A()          # start over
>>> A.name is x.name
True                 # so far so good
>>> A.name = 'fred'
>>> A.name is x.name 
True                 # this is somewhat counter-intuitive