2016-11-16 46 views
1

我一直在閱讀有關時__new__()不會對計算器Inheritance when __new__() doesn't return instance of class返回類的實例返回類的實例,我知道這個問題是蟒蛇3.馬亭彼得斯說,可以通過name mangling完成,並在課堂上直接手動調用它,並在課堂中完全初始化它。繼承時__new __()不蟒蛇2.7.12

我想在python 2.7.12中試試。我可以管理的第一種和第二種方法,但對於第三種方法會產生TypeError

這是我的代碼,第一次嘗試:

class A: 
    def __new__(cls, p1, p2): 
     self = object.__new__(cls) 
     self.p1 = p1 
     self.p2 = p2 
     return [self] 

class B(A): 
    def __new__(cls, p3): 
     self = super(B,cls).__new__(cls,1,2) 
     self[0].p3 = p3 
     return self 

這給了我TypeError: super() argument 1 must be type, not classobj

第二次嘗試:

class A(object): 
    def __new__(cls, p1, p2): 
     self = object.__new__(cls) 
     self.p1 = p1 
     self.p2 = p2 
     return [self] #return not instance 

class B(A): 
    def __new__(cls, p3): 
     self = super(B,cls).__new__(cls,1,2) 
     self[0].p3 = p3 
     return self 

這給了我TypeError: __new__() takes exactly 2 arguments (1 given)

爲什麼會出現這種情況,這可以在python 2.7.12中實現,還是這種技術不兼容?

+1

你的第二次嘗試的作品就好了。我。你忘了通過一個論點? –

+0

另一個問題是關於如何調用'__init __()'當一個子類擁有不同數量的參數時,通常'__init__'只會被調用*一次*。你在這裏沒有做任何事情,這只是簡單的'__new__'覆蓋。 –

+0

是的,我忘記傳遞參數 –

回答

1

在您第一次嘗試時,您傳遞的是舊式類對象,但super()僅接受新式類。

您需要繼承object才能獲得一個新風格的類,您在第二次嘗試中正確地做了這樣的事情。您只需忘記在爭吵通過創建實例時:

>>> class A(object): 
...  def __new__(cls, p1, p2): 
...   self = object.__new__(cls) 
...   self.p1 = p1 
...   self.p2 = p2 
...   return [self] 
... 
>>> class B(A): 
...  def __new__(cls, p3): 
...   self = super(B, cls).__new__(cls, 1, 2) 
...   self[0].p3 = p3 
...   return self 
... 
>>> B() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __new__() takes exactly 2 arguments (1 given) 
>>> B(42) 
[<__main__.B object at 0x10241fa90>] 

你的錯誤告訴你,B.__new__想兩個參數,但只有cls在被傳遞

+0

哦,我看到先生,它發生,因爲我調用B類實例沒有p3參數B()返回「TypeError:__new __()只需要2個參數(1給出)」,但與B(42 )會給主B對象。謝謝你,先生 –