Próbuję podklasy pysam's Tabixfile
klasy i dodać dodatkowe atrybuty na wystąpienie.Nie można zastąpić klasy __init__ z rozszerzenia Cython
class MyTabixfile(pysam.Tabixfile):
def __init__(self, filename, mode='r', *args, **kwargs):
super().__init__(filename, mode=mode, *args, **kwargs)
self.x = 'foo'
Kiedy próbuję instancję mój MyTabixfile
podklasę, otrzymuję 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
Próbowałem też wywołanie konstruktora Tabixfile
wyraźnie:
class MyTabixfile(pysam.Tabixfile):
def __init__(self, filename, mode='r', *args, **kwargs):
pysam.Tabixfile.__init__(self, filename, mode=mode, *args, **kwargs)
self.x = 'foo'
ale to wciąż budzi TypeError: object.__init__() takes no parameters
.
Ta klasa jest faktycznie zaimplementowana w Cython; kod konstruktor jest poniżej:
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)
czytam przez Cython documentation on __cinit__
and __init__
który mówi
Wszelkie argumenty przekazywane do konstruktora zostaną przekazane zarówno metody
__cinit__()
i sposobu__init__()
. Jeśli przewidujesz instacji typ rozszerzenia w Pythonie, może okazać się przydatna dać__cinit__()
metoda*
i**
argumenty tak, że można go akceptują i zignorować dodatkowe argumenty. W przeciwnym razie, każda Python podklasa który ma__init__()
z innym podpisem będą musiały ręcznym__new__()
1 jak__init__()
, które pisarz klasa Python nie spodziewałby się zrobić.
Twórcy pysam nie podejmują starań, aby dodać *args
i **kwargs
metody Tabixfile.__cinit__
, i mój podklasa __init__
pasuje podpis __cinit__
więc nie rozumiem, dlaczego jestem w stanie przesłonić inicjalizacji Tabixfile
.
Pracuję z Python 3.3.1, Cython v.0.19.1 i pysam v.0.7.5.
Twój kod demo naprawdę wyjaśnia przepływ sterowania. Dziękujemy za poświęcenie czasu, aby to dodać. Poszedłem z usunięciem 'super() .__ init__' i zadziałało pięknie i robi to, co spodziewałem się w moich własnych próbach. – gotgenes
Idealna odpowiedź, wystarczy wyciąć i wyczyścić! – pylover