你能澄清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
你能解释一下实际发生了什么吗?
答案 0 :(得分:4)
首先,Python中创建实例字段(而不是类字段)的正确方法是使用__init__
方法。我相信你已经知道了。
Python不会限制您为对象的非声明字段赋值。例如,请考虑以下代码:
class Empty: pass
e = Empty()
e.f = 5
print e.f # shows 5
所以代码中的内容是:
A
的静态字段name
创建了课程A
。A
,a
。a
创建了一个新字段(但不是A
的其他实例),并为其分配B
a.name
的值,该值对象a
是唯一的。A.name
的值
醇>
答案 1 :(得分:1)
您还应该查看这些SO线程以获得进一步的解释:
Static class variables in Python
In Python how can I access "static" class variables within class methods
官方教程: http://docs.python.org/tutorial/classes.html#SECTION0011320000000000000000
请记住,python中的赋值“=”运算符的行为与C ++或Java不同:
http://docs.python.org/reference/simple_stmts.html#assignment-statements
答案 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