pysam's Tabixfile
클래스의 하위 클래스를 만들고 인스턴스화시 추가 특성을 추가하려고합니다. Cython 확장에서 클래스의 __init__을 재정의 할 수 없습니다.
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
:
나는 또한 명시 적으로
Tabixfile
생성자를 호출하려고
>>> 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
:
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
를 발생시킵니다.
이 클래스는 실제로 Cython에서 구현됩니다. 생성자 코드는 다음과 같습니다 :
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)
내가 생성자에 전달
모든 인수가
__cinit__()
방법과__init__()
방법 모두에 전달됩니다 말한다 Cython documentation on__cinit__
and__init__
읽어. 파이썬에서 확장 유형을 서브 클래스 예상되는 경우, 당신이 그것을 유용 에 찾을 수는__cinit__()
방법*
및**
인수가 동의 및 추가 인수를 무시할 수 있도록를 제공합니다. 그렇지 않으면, 다른 서명을 가진__init__()
이있는 파이썬 서브 클래스 는 의 작가가 파이썬 클래스가해야 할 기대하지 않을 것이다 재정__new__()
1뿐만 아니라__init__()
에있을 것이다.
pysam 개발자가 Tabixfile.__cinit__
방법 *args
및 **kwargs
을 추가 알아서했다, 및 내 서브 클래스 __init__
그래서 나는 내가 Tabixfile
의 초기화를 오버라이드 (override) 할 수없는거야 이유를 이해하지 __cinit__
의 서명과 일치 .
저는 파이썬 3.3.1, Cython v.0.19.1 및 pysam v.0.7.5로 개발 중입니다.
귀하의 데모 코드는 정말 제어 흐름을 명확히 : 그 .__ init__ 매개 변수를 허용하지 않는 개체를 똑바로 간다 당신은 또한 PARAM 통과 생략 할 필요가 있으므로, 명시 적 __init__ 방법의가 있습니다. 추가 할 시간을 내 주셔서 감사합니다. 나는'super() .__ init__ '을 지우고 갔는데, 그것은 아름답게 작동했고, 내 자신의 시도에서 일어날 것으로 예상했던 것을합니다. – gotgenes
완벽한 대답, 잘라 내기 & 분명히 충분! – pylover