2016-03-03 4 views
4

Я новичок в python и пробую себя в классах. Я понимаю разницу между __init__ и __new__. Вот отрывок из моего класса,Использование __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 

Что мне нужно сделать в методе __new__() для «Тестирования нового» для печати?

спасибо.

+1

класс Vector2D: ===> class 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__, поэтому не передавайте им цепочку.