2016-03-03 47 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__方法中不采用任何参数,所以不要将它们传递给链。