[英]Change class instance inside an instance method
任何想法是否有辦法使以下代碼工作
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
self = Test(3)
重新綁定本地名稱self
,沒有外部可觀察的效果。
分配self.__dict__
(除非你在討論帶__slots__
實例或帶有非平凡元類的類)通常都可以, self.__init__(3)
可以重新初始化實例。 但是我更喜歡有一個特定的方法self.restart(3)
,它知道它已經在一個已經初始化的實例上被調用,並且做了滿足特定和不尋常情況所需的一切。
不,不。
話雖如此,你可以改變課程 ,但也不要這樣做。
前面的代碼工作,除了它不會做太多,因為它只是替換changeme()范圍內名為'self'的對象。 Python名稱不會鎖定到值,它們始終相對於其作用域或命名空間。
要執行您想要的操作,您需要訪問類外的名稱,您可以在其中分配:
class Test:
def changeme(self):
global myclass
myclass = Test(3)
myclass = Test(2)
myclass.changeme()
print myclass # 3
這基本上只是覆蓋名稱'myclass'以指向新實例。 它不像你想象的那樣“覆蓋”第一個實例。 舊實例仍然存在,除非在別處引用,否則將被垃圾收集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.