Я пытаюсь подкласса pysam's Tabixfile
класса и добавлять дополнительные атрибуты при создании экземпляра.Не удается переопределить __init__ класса из расширения Cython
class MyTabixfile(pysam.Tabixfile):
def __init__(self, filename, mode='r', *args, **kwargs):
super().__init__(filename, mode=mode, *args, **kwargs)
self.x = 'foo'
Когда я пытаюсь создать экземпляр мои MyTabixfile
подкласса, я получаю 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
Я также попытался вызовом Tabixfile
конструктора явно:
class MyTabixfile(pysam.Tabixfile):
def __init__(self, filename, mode='r', *args, **kwargs):
pysam.Tabixfile.__init__(self, filename, mode=mode, *args, **kwargs)
self.x = 'foo'
, но это до сих пор вызывает TypeError: object.__init__() takes no parameters
.
Этот класс фактически реализован в Китоне; код конструктора ниже:
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)
Я прочитал через Cython documentation on __cinit__
and __init__
, который говорит
Любые аргументы, переданные в конструктор будет передан как метод
__cinit__()
и метод__init__()
. Если вы предполагаете подклассов типа расширения в Python, вы можете найти его полезным дать__cinit__()
метод*
и**
аргументов так, что он может принимать и игнорировать дополнительные аргументы. В противном случае, любой Python подкласс который имеет__init__()
с другой подписью придется переопределение__new__()
1, а также__init__()
, что автор класс Python не было бы ожидать, чтобы сделать.
Разработчики pysam сделали взять заботу, чтобы добавить *args
и **kwargs
методы Tabixfile.__cinit__
, и моего подкласса __init__
совпадает с сигнатурой __cinit__
, так что я не понимаю, почему я не могу переопределить инициализацию Tabixfile
,
Я развиваюсь с помощью Python 3.3.1, Cython v.0.19.1 и pysam v.0.7.5.
Ваш демо-код действительно проясняет поток управления. Спасибо, что нашли время, чтобы добавить это. Я пошел с удалением 'super() .__ init__', и он работал красиво и делает то, что я ожидал в моих собственных попытках. – gotgenes
Отличный ответ, cut & ясно достаточно! – pylover