Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中实例化类时会发生什么?_Python_Variables_Class - Fatal编程技术网

在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)

你能澄清一下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)
印刷品:

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
    

    如果没有这个问题的新副本,那么一天就不完整了。去年为了学习编程语言而阅读教程或书籍是件很糟糕的事情……我首先搜索了一遍,却找不到答案