在Python中实例化类时会发生什么?
你能澄清一下Python类和类实例背后的一些想法吗 考虑这一点:在Python中实例化类时会发生什么?,python,variables,class,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 B B 如果在第1点中使用类名,则输出不同: A.name = 'B' # point 1 (updated, class A itself is used here)
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
B
B
如果在第1点中使用类名,则输出不同:
A.name = 'B' # point 1 (updated, class A itself is used here)
印刷品:
B
A
B
B
即使Python中的类是类实例的某种原型,我也希望已经创建的实例保持不变,即输出如下:
A
B
您能解释一下实际发生了什么吗?首先,在Python中创建实例字段(而不是类字段)的正确方法是使用\uuuu init\uu
方法。我相信你已经知道了
Python不限制您为对象的未声明字段赋值。例如,考虑下面的代码:
class Empty: pass
e = Empty()
e.f = 5
print e.f # shows 5
因此,代码中的内容是:
创建类A
,并使用A
指定的静态字段name
创建A
,A
的实例
您为对象a
(但不为a
的其他实例)创建一个新字段,并为其分配B
打印a.name
的值,该值对于对象a
是唯一的
打印属于该类的静态字段A.name
您还应该查看这些SO线程以获得进一步的解释:
以及官方教程:
记住Python中赋值“=”操作符的行为与C++或java不同:
也许这个例子可以让事情变得更清楚。回想一下,Python名称不是存储(因为变量在其他语言中)而是对存储的引用。您可以通过id(name)找到名称所指的内容。标识运算符x为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
如果没有这个问题的新副本,那么一天就不完整了。去年为了学习编程语言而阅读教程或书籍是件很糟糕的事情……我首先搜索了一遍,却找不到答案