В Java я привык к ошибкам компилятора, когда не удается реализовать все необходимые методы интерфейса. Я был удивлен, когда сделал объект в Jython, который не реализовал все необходимые методы (getRowCount, getColumnCount, getValueAt) javax.Swing.AbstractTableModel, который реализует интерфейс TableModel. Из Javadocs AbstractTableModel :
Чтобы создать конкретную TableModel в качестве подкласса AbstractTableModel, вам нужно только предоставить реализации для следующих трех методов:
Класс Jython, который должен потерпеть неудачу:
class ResourceTableModel(AbstractTableModel):
COLUMN_NAMES = ('path','filename','parametername', 'parametervalue')
def __init__(self, *rows):
self.data = list(rows)
def getRowCount(self):
return len(self.data)
def getColumnCount(self):
return len(self.COLUMN_NAMES)
Тестирование выше:
def test_column_count(self):
e = mySwingGUI.ResourceTableModel()
column_count = e.getColumnCount()
self.assertEqual(column_count,4)
Затем я прочитал, что вы можете использовать isinstance (), чтобы увидеть, является ли объект экземпляром указанного объекта. c interface.
, поэтому я попробовал это:
def test_column_count(self):
e = mySwingGUI.ResourceTableModel()
if isinstance(e,javax.swing.table.AbstractTableModel):
print("true")
else:
print("false")
column_count = e.getColumnCount()
self.assertEqual(column_count,4)
, но он печатает true, хотя я не реализовал все методы. Есть ли способ заставить Jython реализовывать контракты интерфейса или это только с помощью компилятора Java?