2017-09-01 7 views
0

Ich weiß nicht, wie Sie vorgehen, um eine abgeleitete Klasse zu definieren, die einen überladenen __init__() Konstruktor mit anderen Zahlen oder Parametern hat.Python3 "@ typing.overload" und Parameter

Die Klasse ist von Qt5, und ich verwende PyQt5 (obwohl ich denke, das ist nicht wichtig). In QtGui.pyi ich sehe:

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: ... 

Mein Startversuch ist:

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) 

jedoch in PyCharm die zweite __init__ warnt mich:

A series of @overload-decorated methods should always be followed by an implementation that is not @overload-ed 
  1. Welche Code sollte ich schreiben die endgültige __init__ Definition, vorausgesetzt, dass Sie die Überlastungen sehen können unterschiedliche Anzahl von Parametern haben?
  2. PyCharm scheint sich nicht über die Definitionen aus QtGui.pyi zu beschweren, die keine zusätzliche nicht überladene Definition bieten, aber es scheint in meinem Code zu sein.
  3. Ich habe die super().__init__() s in jede meiner Überlastungen als ohne dass PyCharm beschwert Call to __init__ of super class is missed, ich weiß nicht, ob das richtig/erforderlich ist.

Antwort

0

Bitte lesen Sie this Teil PEP 484 über Stub-Dateien und typing.overload Verwendung in Stub-Dateien und regelmäßigen Python-Dateien.

+0

Danke, von PEP 484 Ich verstehe jetzt, warum 'QtGui.pyi' nur die' @ Überladung '[meine Punkt # 2] hat. Ich sehe auch, dass es egal ist, was die Körper der Überlastung sind, da sie nicht aufgerufen werden, so dass die PyCharm Warnung über "__init__" fehlt ist wahrscheinlich falsch [meine Nummer # 3]. Das lässt mich immer noch mit # 1: Wie schreibt man tatsächlich die einzelne Implementierung Definition in diesem Fall, angesichts der unterschiedlichen Anzahl von Parametern? Ich kann nur daran denken, zu verwenden: "__init __ (selbst, * args, ** kwargs)" --- ist das der richtige Ansatz? – JonBrave