Clase Numpy Matrix: atributos de constructor predeterminados para la clase heredada

Quiero implementar mi propia clase de matriz que hereda de la clase de matriz de numpy.

el constructor de matriz de numpy requiere un atributo, algo como ("1 2; 3 4'") . En contraste, mi constructor no debería requerir atributos y debería establecer un atributo predeterminado para el superconstructor.

Eso fue lo que hice:

 import numpy as np class MyMatrix(np.matrix): def __init__(self): super(MyMatrix, self).__init__("1 2; 3 4") if __name__ == "__main__": matrix = MyMatrix() 

Debe haber un error estúpido en este código ya que sigo recibiendo este error:

 this_matrix = np.matrix() TypeError: __new__() takes at least 2 arguments (1 given) 

Realmente no tengo ni idea de eso y googlear no ayudó hasta ahora.

¡Gracias!

¡Buena pregunta!

Al mirar la fuente, parece que np.matrix establece el argumento de los data en __new__ , no en __init__ . Este es un comportamiento contraintuitivo, aunque estoy seguro de que hay una buena razón para ello.

De todos modos, lo siguiente funciona para mí:

 class MyMatrix(np.matrix): def __new__(cls): # note that we have to send cls to super's __new__, even though we gave it to super already. # I think this is because __new__ is technically a staticmethod even though it should be a classmethod return super(MyMatrix, cls).__new__(cls, "1 2; 3 4") mat = MyMatrix() print mat # outputs [[1 2] [3 4]] 

Anexo: es posible que desee considerar el uso de una función de fábrica, en lugar de una subclase, para el comportamiento que desea. Esto le daría el siguiente código, que es mucho más corto y claro, y no depende de los detalles de implementación __init__ __new__ __init__ :

 def mymatrix(): return np.matrix('1 2; 3 4') mat = mymatrix() print mat # outputs [[1 2] [3 4]] 

Por supuesto, es posible que necesite una subclase por otras razones.