2010-04-04 7 views
6

Ich versuche, ein paar zusätzliche Methoden zu einem Matrix-Typ aus der Pysparse-Bibliothek hinzuzufügen. Abgesehen davon möchte ich, dass sich die neue Klasse genau wie das Original verhält, also entschied ich mich, die Änderungen durch Vererbung zu implementieren. Allerdings, wenn ich versuchePython: Ich bin nicht in der Lage, von einer C-Erweiterung zu erben

from pysparse import spmatrix 

class ll_mat(spmatrix.ll_mat): 
    pass 

ergibt ich die folgenden Fehler

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

Was diesen Fehler verursacht? Gibt es eine Möglichkeit, die Delegierung zu verwenden, sodass sich meine neue Klasse genauso verhält wie das Original?

Antwort

9

ll_mat ist dokumentiert, ein function zu sein - nicht der Typ selbst. Das Idiom ist bekannt als "Factory-Funktion" - es ermöglicht einem "Ersteller aufrufbar", abhängig von seinen Argumenten unterschiedliche tatsächliche zugrunde liegende Typen zurückzugeben.

Sie könnten versuchen, ein Objekt von diesem zu erzeugen und dann von diesem Objekttyp erben:

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

darüber im Klaren sein, aber, dass es für einen eingebauten Typen nicht unterstützt wird es zu erklären, durchaus machbar ist subclassed (das könnte sogar getan werden, nur um einige bescheidene Overhead zu sparen); wenn es das ist, was diese Art der Fall ist, dann können Sie eine Unterklasse es nicht und wird eher Haltung und Delegation verwenden, d.h .:

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.

Verwandte Themen