7

任何想法是否有办法使以下代码工作

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
4

3 回答 3

7

self = Test(3)正在重新绑定本地名称self,没有外部可观察的影响。

分配self.__dict__(除非您正在谈论__slots__具有非平凡元类的类或来自类的实例)通常是可以的self.__init__(3),重新初始化实例也是如此。但是,我更喜欢有一个特定的方法self.restart(3),它知道它正在一个已经初始化的实例上被调用,并做任何需要满足特定和不寻常的情况的事情。

于 2010-01-26T06:20:31.540 回答
2

不,也不。

话虽如此,您可以更改课程,但也不要这样做。

于 2010-01-26T06:16:32.133 回答
2

前面的代码可以工作,只是它不会做太多事情,因为它只是替换了 changeme() 范围内名为“self”的对象。Python 名称没有锁定到值,它们总是相对于它们的范围或命名空间。

要执行您想要的操作,您需要访问类外部的名称,您可以从其中分配给它:

class Test:
  def changeme(self):
    global myclass
    myclass = Test(3)

myclass = Test(2)
myclass.changeme()
print myclass # 3

这基本上只是覆盖名称“myclass”以指向新实例。它不会像您想象的那样“覆盖”第一个实例。旧实例仍然存在,除非在其他地方引用,否则将被垃圾收集。

于 2010-01-26T06:20:08.960 回答