gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:10:56 30 4
gpt4 key购买 nike

Python 使用名称来引用对象。当我们说 a = b 时,ab 现在指的是同一个对象,如果我们改变 a ,我们将在 b 中看到相同的变化。例如:

a = [1, 2, 3]
b = a

a.append(4)

print(b)

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

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

a = 1
b = a

a = a + 1

print(b)

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

这个问题不是 this one 的重复问题,正如我特别询问在这种情况下对象创建是如何发生的,而另一个问题更普遍地涉及名称何时共享对象。

最佳答案

我在 Luciano Ramalho 的书 Fluent Python 中找到了我正在寻找的关于对象创建机制的信息。

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

这可以用下面的例子来说明:

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}

a = C() 行调用 __new__ 后跟 __init__,正如我们从 __dict__< 的打印输出中看到的那样。这可以分解为单独的调用,如对象 b 所示。

This question也是相关的。

关于python - Python什么时候创建一个新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41701200/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com