2016-03-03 49 views
4

使用__new__我是新來的蟒蛇,並試圖在我的手類。我明白了__init____new__之間的區別。這裏是我班的一個片段,在python

class Vector2D: 

    def __new__(cls): 
     print "Testing new" 
     return super(Vector2D,cls).__new__(cls) 

    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def __str__(self): 
     return "X:" + str(self.x) + ",Y:" + str(self.y) 

我初始化類像下面和期待的「測試新」首先要印刷:

def Main(): 
    vec = Vector2D(1,2) 
    print "Printing vec:",vec 

但我只得到輸出,

Printing vec: X:1,Y:2 

對於要打印的「Testing new」,方法__new__()需要做些什麼?

謝謝。

+1

類的Vector2D:===>類的Vector2D(對象): –

+0

@WillVousden我在這裏縮進堆棧幾次獲得代碼風格。 – Ayubx

+0

@Ayubx我爲你解決了縮進問題。只需編寫代碼(因此不需要額外的縮進),然後選擇完整的代碼塊並單擊'{}'按鈕一次。這將推動一切超過4個空間的正確佈局。 – Duncan

回答

6

你必須讓你的Vector2D類的object一個子類,否則很多事情將無法正常工作。那些不起作用的東西包括__new__super

這應該只是罰款:

class Vector2D(object): 
    def __new__(cls, *args, **kw): 
     print "Testing new" 
     return super(Vector2D,cls).__new__(cls) 


    def __init__(self, x, y): 
     self.x = x 
     self.y = y 


    def __str__(self): 
     return "X:" + str(self.x) + ",Y:" + str(self.y) 

注意,當你構建的實例所使用的參數都傳遞給__new____init__所以你必須準備接受他們__new__,但你的父( object)在其__new__方法中不採用任何參數,所以不要將它們傳遞給鏈。