2017-09-01 584 views
0

我不知道如何继续定义派生类,该派生类具有带有不同数字或参数的重载__init__()构造函数。Python3“@typing.overload”和参数

该类是从Qt5,我使用PyQt5(虽然我认为这本身并不重要)。在QtGui.pyi我看到:

class QStandardItemModel(QtCore.QAbstractItemModel): 
    @typing.overload 
    def __init__(self, parent: typing.Optional[QtCore.QObject] = ...) -> None: ... 
    @typing.overload 
    def __init__(self, rows: int, columns: int, parent: typing.Optional[QtCore.QObject] = ...) -> None: ... 

我开始尝试是:

class DBStandardItemModel(QtGui.QStandardItemModel): 
    @typing.overload 
    def __init__(self, parent: typing.Optional[QtCore.QObject] = None) -> None: 
     super().__init__(parent) 
    @typing.overload 
    def __init__(self, rows: int, columns: int, parent: typing.Optional[QtCore.QObject] = None) -> None: 
     super().__init__(rows, columns, parent) 

然而,PyCharm第二__init__警告我:

A series of @overload-decorated methods should always be followed by an implementation that is not @overload-ed 
  1. 我应该写什么代码最后的__init__的定义,因为你可以看到重载有不同数量的参数?
  2. PyCharm似乎没有抱怨QtGui.pyi的定义,它们不提供额外的非重载定义,但似乎在我的代码中。
  3. 我已将super().__init__()放入每个重载中,因为没有PyCharm抱怨Call to __init__ of super class is missed,我不知道这是否正确/需要。

回答

0

请阅读有关存根文件PEP 484的this一部分,存根文件和常规的Python文件typing.overload使用。

+0

谢谢你,从PEP 484我现在明白了为什么'QtGui.pyi'只有'@ overload's [我的观点#2]。我也看到,'overload'的主体是什么都没有关系,因为它们没有被调用,所以关于'__init__'缺少的PyCharm警告可能是虚假的[我的观点#3]。 这仍然给我#1:在这种情况下,给定不同数量的参数,实际上如何编写单个实现定义?我只能想到必须使用:'__init __(self,* args,** kwargs)'---是否是正确的方法? – JonBrave