簡體   English   中英

在實例方法中更改類實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM