2015-12-12 49 views
4

我想有一個自定義的complex類,可以得到一個字符串作爲輸入("1 2"),並閱讀realimag部分。覆蓋__init__從一個複雜的對象

class myComplex(complex): 
    def __init__(self, inp): 
     real, imag = inp.split() 
     self.real = float(real) 
     self.imag = float(imag) 


comp = myComplex("1 2") 
print comp # (1+2j) 

,但我得到的錯誤:

Traceback (most recent call last): 
    File "my_complex.py", line 8, in <module> 
    comp1 = myComplex(inp1) 
ValueError: complex() arg is a malformed string 

,這是否意味着我的__init__不overwritting從complex一個還是我失去了一些基本的東西?

回答

4

Python的complexrealimag的值分配給__new__

__new____init__之前運行,並負責創建該對象。執行(考慮myComplexcomplex)是這樣的:

  1. myComplex("1 1")

  2. myComplex.__new__(cls, inp)

  3. complex.__new__(cls, real, imag)

  4. myComplex.__init__(self, inp)

(沒有complex.__init__因爲myComplex.__init__不叫)

這意味着運行__init__之前的說法"1 2"解析。

你應該重寫__new__

class myComplex(complex): 
    def __new__(cls, inp): 
     real, imag = inp.split() 
     return super(myComplex, cls).__new__(cls, float(real), float(imag))