【发布时间】:2019-07-05 05:19:13
【问题描述】:
我曾尝试使用 sip 包装器类型的 abc.ABCMeta,它在使用 abc.ABC 进行子类化时效果很好。
class QABCMeta(wrappertype, ABCMeta):
pass
class WidgetBase(QWidget, metaclass=QABCMeta):
...
class InterfaceWidget(WidgetBase, ABC):
...
class MainWidget(InterfaceWidget):
...
但它不适用于typing.Generic。
class QGenericMeta(wrappertype, GenericMeta):
pass
class WidgetBase(QWidget, Generic[T], metaclass=QGenericMeta):
...
class GenericWidget(WidgetBase[float]):
...
它提出了:
line 980, in __new__
self if not origin else origin._gorg)
TypeError: can't apply this __setattr__ to sip.wrappertype object
我希望它像往常一样使用通用子类:
class TableBase(QTableWidget, Generic[T]):
@abstractmethod
def raw_item(self, row: int) -> T:
...
def data(self) -> Iterator[T]:
yield from (self.raw_item(row) for row in range(self.rowCount()))
class MainTable(TableBase[float]):
def raw_item(self, row: int) -> float:
return float(self.item(row, 1).text()) # implementation
table = MainTable()
for data in table.data():
data: float
但是当没有继承 Generic[T] 时,data 仍然是 Any。
可以用 PEP 560 解决类型检查吗?
【问题讨论】:
标签: python pyqt5 metaclass typing pyside2