Python什么时候创建一个新对象

When does Python Create a New Object

python使用名称引用对象。当我们说a = bab现在指的是同一个对象,如果我们改变a的话,就会看到b的变化。例如:

1
2
3
4
5
6
a = [1, 2, 3]
b = a

a.append(4)

print(b)

将打印[1, 2, 3, 4]

但是,一些操作确实会创建新对象。例如:

1
2
3
4
5
6
a = 1
b = a

a = a + 1

print(b)

将打印1。显然,行a = a + 1以某种方式创建了一个值为a + 1的新对象,并将名称a绑定到它。这是怎么工作的?在这种情况下,创建新对象的机制是什么?

这个问题并不是这个问题的复制品,因为我特别问在这种情况下对象创建是如何发生的,而另一个问题更普遍地是关于名称共享对象的时间。


我在Luciano Ramalho的书《流畅的Python》中找到了我正在寻找的关于物体创造机制的信息。

Ramalho解释说,虽然__init__通常被认为是"构造函数",实际上,对象是通过调用__new__方法创建的。它是一个类方法,它返回一个类的实例,该实例作为第一个参数传递给__init__(通常是"self)。因此,__init__是初始值设定项,而不是构造函数。

这可以用以下示例加以说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class C(object):
    def __new__(cls):
        new_inst = object.__new__(cls)
        print new_inst.__dict__
        new_inst.var_1 = 1
        return new_inst

    def __init__(self):
        print self.__dict__
        self.var_2 = 2

a = C()             # Prints:
                        # {}
                        # {'var_1': 1}
print a.__dict__    # returns {'var_2': 2, 'var_1': 1}

b = C.__new__(C)    # Prints:
                        # {}
print b.__dict__    # returns {'var_1': 1}

b.__init__()        # Prints:
                        # {'var_2': 2, 'var_1': 1}
print b.__dict__    # returns {'var_2': 2, 'var_1': 1}

__dict__的打印输出可以看出,行a = C()调用__new__,后面跟着__init__。这可以分成单独的调用,如对象b所示。

这个问题也是相关的。