在实例方法中更改类实例

时间:2010-01-26 06:13:29

标签: python class instance hotswap

知道是否有办法让以下代码生效

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

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'以指向新实例。它不像你想象的那样“覆盖”第一个实例。旧实例仍然存在,除非在别处引用,否则将被垃圾收集。