gpt4 book ai didi

在构造函数中对 self 的 Python 赋值不会使对象相同

转载 作者:太空狗 更新时间:2023-10-30 01:51:02 25 4
gpt4 key购买 nike

我正在用 Python 编写一个构造函数。当使用现有对象作为其输入进行调用时,它应该将"new"对象设置为同一对象。这是一个 10 行的演示:

class A:
def __init__(self, value):
if isinstance(value, A):
self = value
else:
self.attribute = value
a = A(1)
b = A(a)#a and b should be references to the same object
print("b is a", b is a)#this should be true: the identities should be the same
print("b == a", b == a)#this should be true: the values should be the same

我希望从现有对象 a 构造的对象 A(a)a。为什么不是呢?明确地说,我希望 A(a) 引用与 a 相同的对象,而不是副本。

最佳答案

self 与任何其他参数一样,属于函数或方法的局部变量。分配给局部变量的裸名永远不会影响该函数或方法之外的任何内容,它只是在本地重新绑定(bind)该名称。

正如一条评论所暗示的那样,不清楚为什么你不这样做

b = a

假设您有充分的理由,您需要覆盖的不是 __init__,而是 __new__(然后在 __init__ 中采取一些预防措施以避免双重初始化)。这不是一门显而易见的类(class),所以我会等你解释你到底想完成什么。

添加:澄清了我同意 OP 的需求,即工厂函数(理想情况下,我建议,作为类方法)比 __new__ 更好,更清晰,后者可以工作(它毕竟是一个类方法)但是以一种不太清晰的方式。

所以,我将编码如下:

class A(object):

@classmethod
def make(cls, value):
if isinstance(value, cls): return value
return cls(value)

def __init__(self, value):
self.attribute = value

现在,

a = A.make(1)
b = A.make(a)

通过传递给 A.make 的参数类型实现 OP 的期望。

关于在构造函数中对 self 的 Python 赋值不会使对象相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28531939/

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