Python 在实例方法内更改类实例

Python 在实例方法内更改类实例,python,class,instance,hotswap,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):
        self = Test(3)

t = Test(1)
assert t.var == 1
t.changeme()
assert t.var == 3
对于更复杂的对象(如django模型,热交换实例所引用的db条目),是否可以安全地使用以下内容

没有,也没有


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

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

要执行所需操作,您需要访问类外的名称,您可以从类内分配给该名称:

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

myclass = Test(2)
myclass.changeme()
print myclass # 3
这基本上只是覆盖名称“myclass”以指向新实例。它不会像你想象的那样“覆盖”第一个实例。旧实例仍然存在,除非在别处引用,否则将被垃圾收集。

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


分配
self.\uuuuu dict\uuuuuuu
(除非您谈论的是具有
\uuuuu插槽的实例或来自具有非平凡元类的类的实例)通常是可以的,
self.\uuuuu init\uuuuu3)
也可以重新初始化实例。但是,我更希望有一个特定的方法
self.restart(3)
,它知道它在一个已经初始化的实例上被调用,并且做任何需要的事情来满足特定和不寻常的情况。

为什么?你显然想要一个新的实例,为什么不创建一个新的实例,然后扔掉这个呢?请解释用例。Django的模型元类是。。。凌乱的如果试图重新分配
self,我不会感到惊讶。uu dict_uu
发生了惊人的爆炸。@Ignacio,有了“非平凡的元类”(或
\uuu slots\uuu
等),您可能需要使用
getattr
/
setattr
的循环。编写我提倡的
restart
方法的优点是,您可以将支持各种情况所需的调整(如果有的话)分离出来,从普通对象到元类混乱的对象等等。
class Test:
  def changeme(self):
    global myclass
    myclass = Test(3)

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