任何想法,如果有一种方法,使下面的代码来工作

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模型,热插拔分贝条目中的实例被提及)

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
有帮助吗?

解决方案

self = Test(3)是重新绑定本地名称self,没有外部观察的效果。

(除非你在谈论与self.__dict__或类与非平凡元类实例)分配__slots__通常是好的,所以是self.__init__(3)重新初始化实例。不过,我更愿意有哪些的具体方法self.restart(3)知道它被称为上已经被初始化的实例和为所欲为需要真实以满足特定和不寻常的情况。

其他提示

没有和没有。

说了这么多,你的可以的修改的的,但不这样做,要么。

在以前的代码的作品,但它不会做很多,看到它只是取代了名为“自我”()changeme范围内的对象。蟒名称不锁定到的值,它们总是相对于它们的范围或命名空间。

要做到你想要什么,你就需要有类,你可以从内部将其分配给外部访问的名称:

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

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

这基本上只覆盖名“MyClass的”至点到新的实例。它没有“覆盖”就像你的第一个实例的想象。旧的实例仍然住,并且将收集的垃圾,除非别处引用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top