2010-04-04 14 views
6

Estoy tratando de agregar algunos métodos adicionales a un tipo de matriz de la biblioteca pysparse. Además de eso, quiero que la nueva clase se comporte exactamente como la original, por lo que decidí implementar los cambios utilizando la herencia. Sin embargo, cuando intentoPython: no se puede heredar de una extensión C

from pysparse import spmatrix 

class ll_mat(spmatrix.ll_mat): 
    pass 

esto da como resultado el siguiente error

TypeError: Error when calling the metaclass bases 
    cannot create 'builtin_function_or_method' instances 

¿Qué está causando este este error? ¿Hay alguna forma de usar la delegación para que mi nueva clase se comporte exactamente de la misma manera que el original?

Respuesta

9

ll_mat está documentado como function - no el tipo en sí. El modismo se conoce como "función de fábrica": permite que un "creador invocable" devuelva diferentes tipos subyacentes reales según sus argumentos.

Se podría tratar de generar un objeto de esta y luego heredar de tipo de ese objeto:

x = spmatrix.ll_mat(10, 10) 
class ll_mat(type(x)): ... 

Tenga en cuenta, sin embargo, que es bastante factible para un tipo incorporado a declarar que no apoyará estar subclasificado (esto podría hacerse incluso para ahorrar un poco de sobrecarga); si eso es lo que hace ese tipo, entonces no se puede subclase, y tendrá lugar tiene que utilizar la contención y la delegación, es decir .:

class ll_mat(object): 
    def __init__(self, *a, **k): 
     self.m = spmatrix.ll_mat(*a, **k) 
     ... 
    def __getattr__(self, n): 
     return getattr(self.m, n) 

etc, etc.

Cuestiones relacionadas