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