我正在尝试对pysam 的Tabixfile
类进行子类化并在实例化时添加其他属性。
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
。
这个类实际上是在 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 )
我通读了Cython 文档__cinit__
,__init__
其中说
传递给构造函数的任何参数都将传递给
__cinit__()
方法和__init__()
方法。如果您期望在 Python 中子类化您的扩展类型,您可能会发现提供方法和参数很有用,__cinit__()
*
**
以便它可以接受和忽略额外的参数。否则,任何具有__init__()
不同签名的 Python 子类都必须覆盖__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 进行开发。