Ich versuche, pysam's Tabixfile
Klasse Unterklasse und zusätzliche Attribute bei Instanziierung hinzufügen.Kann nicht überschreiben __init__ der Klasse von Cython-Erweiterung
class MyTabixfile(pysam.Tabixfile):
def __init__(self, filename, mode='r', *args, **kwargs):
super().__init__(filename, mode=mode, *args, **kwargs)
self.x = 'foo'
Wenn ich versuche, meine MyTabixfile
Unterklasse zu instanziiert, erhalte ich eine TypeError: object.__init__() takes no parameters
:
>>> mt = MyTabixfile('actn2-oligos-forward.tsv.gz')
Traceback (most recent call last):
File "<ipython-input-11-553015ac7d43>", line 1, in <module>
mt = MyTabixfile('actn2-oligos-forward.tsv.gz')
File "mytabix.py", line 4, in __init__
super().__init__(filename, mode=mode, *args, **kwargs)
TypeError: object.__init__() takes no parameters
Ich versuchte auch explizit die Tabixfile
Konstruktor aufrufen: TypeError: object.__init__() takes no parameters
class MyTabixfile(pysam.Tabixfile):
def __init__(self, filename, mode='r', *args, **kwargs):
pysam.Tabixfile.__init__(self, filename, mode=mode, *args, **kwargs)
self.x = 'foo'
aber noch erhöht.
Diese Klasse ist tatsächlich in Cython implementiert; der Konstruktor-Code ist unter:
cdef class Tabixfile:
'''*(filename, mode='r')*
opens a :term:`tabix file` for reading. A missing
index (*filename* + ".tbi") will raise an exception.
'''
def __cinit__(self, filename, mode = 'r', *args, **kwargs):
self.tabixfile = NULL
self._open(filename, mode, *args, **kwargs)
ich durch die Cython documentation on __cinit__
and __init__
lesen, sagt
Alle Argumente an den Konstruktor übergeben wird sowohl für die
__cinit__()
Methode übergeben werden und die__init__()
Methode. Wenn Sie Subklassen Ihre Erweiterungstyp in Python antizipieren, Sie geben die__cinit__()
Verfahren nützlich finden*
und**
Argumente, so dass es akzeptieren und zusätzliche Argumente ignorieren. Andernfalls jede Python-Unterklasse, die ein__init__()
mit einer anderen Signatur muss Überschreibung__new__()
1 sowie__init__()
, die die Schreiber eine Python-Klasse nicht erwarten würde zu tun zu haben.
Die pysam Entwickler die Sorgfalt taten *args
und **kwargs
zur Tabixfile.__cinit__
Methode hinzuzufügen, und meine Unterklasse __init__
stimmt mit der Unterschrift von __cinit__
so verstehe ich nicht, warum ich bin nicht in der Lage die Initialisierung von Tabixfile
außer Kraft zu setzen .
Ich entwickle mit Python 3.3.1, Cython v.0.19.1 und Pysam v.0.7.5.
Ihr Demo-Code verdeutlicht wirklich den Steuerungsablauf. Danke, dass Sie sich die Zeit genommen haben, das hinzuzufügen. Ich ging mit dem Entfernen von 'super() .__ init__' und es funktionierte wunderbar und macht, was ich bei meinen eigenen Versuchen erwartet hatte. – gotgenes
Perfekte Antwort, schneiden und klar genug! – pylover