与任何其他参数一样,self是函数或方法的局部变量之一.赋值给局部变量的裸名称永远不会影响该函数或方法之外的任何内容,它只是本地重新绑定该名称.
正如一条评论正确地指出的那样,目前还不清楚你为什么不这样做
b = a
假设你有一个合理的理由,你需要覆盖的不是__init__,而是__new__(然后在__init__中采取一些预防措施以避免双重初始化).这不是一个明显的过程,所以我会等你解释你究竟想要完成什么.
补充:澄清了我同意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)
完成OP的愿望,多样化地传递给传递给A.make的论证类型.