Tôi đang cố gắng phân lớp pysam's Tabixfile
lớp và thêm các thuộc tính bổ sung trên instantiation.Không thể ghi đè __init__ của lớp từ phần mở rộng của Cython
class MyTabixfile(pysam.Tabixfile):
def __init__(self, filename, mode='r', *args, **kwargs):
super().__init__(filename, mode=mode, *args, **kwargs)
self.x = 'foo'
Khi tôi cố gắng để nhanh chóng MyTabixfile
lớp con của tôi, tôi nhận được một 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
Tôi cũng đã cố gắng kêu gọi các nhà xây dựng Tabixfile
một cách rõ ràng:
class MyTabixfile(pysam.Tabixfile):
def __init__(self, filename, mode='r', *args, **kwargs):
pysam.Tabixfile.__init__(self, filename, mode=mode, *args, **kwargs)
self.x = 'foo'
nhưng điều này vẫn còn gây TypeError: object.__init__() takes no parameters
.
Lớp này thực sự được triển khai trong Cython; mã constructor là dưới đây:
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)
Tôi đọc qua Cython documentation on __cinit__
and __init__
mà nói
Bất kỳ đối số truyền cho constructor sẽ được chuyển đến cả
__cinit__()
phương pháp và phương pháp__init__()
. Nếu bạn dự đoán subclassing kiểu mở rộng của bạn bằng Python, bạn có thể tìm thấy nó hữu ích để cung cấp cho các__cinit__()
phương pháp*
và**
luận để nó có thể chấp nhận và bỏ qua đối số thêm. Nếu không, bất kỳ lớp con Python nào có số có số__init__()
có chữ ký khác sẽ phải ghi ghi đè__new__()
1 cũng như__init__()
, mà tác giả của một lớp Python sẽ không phải làm.
Các nhà phát triển pysam đã làm mất sự chăm sóc để thêm *args
và **kwargs
với phương pháp Tabixfile.__cinit__
, và lớp con tôi __init__
phù hợp với chữ ký của __cinit__
vì vậy tôi không hiểu tại sao tôi không thể ghi đè lên khởi của Tabixfile
.
Tôi đang phát triển với Python 3.3.1, Cython v.0.19.1 và pysam v.0.7.5.
code demo của bạn thực sự làm rõ dòng điều khiển. Cảm ơn bạn đã dành thời gian để thêm điều đó. Tôi đã đi với loại bỏ 'siêu() .__ init__' và nó làm việc đẹp và làm những gì tôi đã dự kiến sẽ xảy ra trong nỗ lực của riêng tôi. – gotgenes
Câu trả lời hoàn hảo, cắt và đủ rõ ràng! – pylover