知道是否有办法让以下代码生效
class Test(object):
def __init__(self, var):
self.var = var
def changeme(self):
self = Test(3)
t = Test(1)
assert t.var == 1
t.changeme()
assert t.var == 3
类似于以下安全用于更复杂的对象(如django模型,热交换实例所指的db条目)
class Test(object):
def __init__(self, var):
self.var = var
def changeme(self):
new_instance = Test(3)
self.__dict__ = new_instance.__dict__
t = Test(1)
assert t.var == 1
t.changeme()
assert t.var == 3
答案 0 :(得分:7)
self = Test(3)
重新绑定本地名称self
,没有外部可观察到的影响。
分配self.__dict__
(除非您正在讨论具有__slots__
的实例或具有非平凡元类的类)通常是正常的,self.__init__(3)
重新初始化实例也是如此。但是,我更希望有一个特定的方法self.restart(3)
,知道它已经在已经初始化的实例上被调用,并且做了满足特定和不寻常情况所需的一切。
答案 1 :(得分:3)
不,不。
话虽如此,你可以更改类,但也不要这样做。
答案 2 :(得分:2)
以前的代码可以工作,除了它不会做太多,因为它只是替换了changeme()范围内名为'self'的对象。 Python名称不会锁定到值,它们始终相对于其作用域或命名空间。
要执行您想要的操作,您需要访问类外的名称,您可以从其中分配名称:
class Test:
def changeme(self):
global myclass
myclass = Test(3)
myclass = Test(2)
myclass.changeme()
print myclass # 3
这基本上只是覆盖名称'myclass'以指向新实例。它不像你想象的那样“覆盖”第一个实例。旧实例仍然存在,除非在别处引用,否则将被垃圾收集。