2017-09-01 41 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