2013-12-21 35 views
4

我有這樣的結構:Python的變化自我繼承

class Foo: 
    def __init__(self, val1): 
     self.val1 = val1 

    def changeToGoo(self) 
     HOW??? 

class Goo(Foo): 
    def __init__(self, val1, val2): 
     super(val1) 
     self.val2 = val2 

a = Foo(1) 
a.changeToGoo() 

「一」是現在富
的一個實例,現在我想改變它是粘粘的一個實例,通過使用方法「changeToGoo」,並添加其他值。

這怎麼能在Python中完成?

我曾嘗試:

self.__class__ = Goo 

,但是當我檢查:

type(a) 

它仍然是富,而不是GOO。

+3

什麼是你正在試圖解決的實際問題? – NPE

+1

請詳細說明你爲什麼要這麼做。 – reindeer

+2

你永遠不需要爲它的一個子類拋出一個超類,這是一個設計缺陷的標誌。 –

回答

6

在Python 2,請從objectFoo繼承,使之成爲新的風格類,而不是:

>>> class Foo(object): 
...  def __init__(self, val1): 
...   self.val1 = val1 
... 
>>> class Goo(Foo): 
...  def __init__(self, val1, val2): 
...   super(val1) 
...   self.val2 = val2 
... 
>>> f=Foo(1) 
>>> f.__class__ 
<class '__main__.Foo'> 
>>> f.__class__ = Goo 
>>> f 
<__main__.Goo object at 0x10e9e6cd0> 
>>> type(f) 
<class '__main__.Goo'> 

現在你可以變化self.__class__。在changeToGoo()方法:

def changeToGoo(self) 
    self.__class__ = Goo 
    self.val2 = 'some value' 

或再使用__init__

def changeToGoo(self) 
    self.__class__ = Goo 
    self.__init__(self.val1, 'some value') 

這確實讓你的對象有點怪異,因爲他們改變身份。變形很少是一個好主意。你可能想重新考慮你的用例。

+0

這是對的,但對象也應該經歷子類的__init__'ialisation。 – Marcin

2

你可以這樣做:

def changeToGoo(self, val2): 
    return Goo(self.val1, val2) 

然後調用和分配,增加額外的屬性

a = a.changeToGoo(val2)