2017-09-01 9 views
0

Je ne sais pas comment procéder pour définir une classe dérivée qui a un constructeur surchargé __init__() avec des nombres ou des paramètres différents.Python3 "@ typing.overload" et les paramètres

La classe est de Qt5, et j'utilise PyQt5 (bien que je ne pense pas que cela soit important en soi). En QtGui.pyi je vois:

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

Ma tentative de départ est:

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) 

Cependant, PyCharm la deuxième __init__ me met en garde contre:

A series of @overload-decorated methods should always be followed by an implementation that is not @overload-ed 
  1. Quel code dois-je en train d'écrire pour la définition finale __init__, étant donné que vous pouvez voir les surcharges ont des nombres différents de paramètres?
  2. PyCharm ne semble pas se plaindre des définitions de QtGui.pyi qui n'offrent pas de définition supplémentaire non surchargée, pourtant il semble dans mon code.
  3. J'ai mis le super().__init__() s dans chacune de mes surcharges comme sans que PyCharm se plaint Call to __init__ of super class is missed, je ne sais pas si c'est correct/requis.

Répondre

0

S'il vous plaît lire this partie de PEP 484 sur les fichiers stub et l'utilisation typing.overload dans des fichiers stub et les fichiers Python réguliers.

+0

Merci, à partir de PEP 484 Je comprends maintenant pourquoi 'QtGui.pyi' a seulement la' @ overload's [mon point # 2]. Je vois aussi que les corps des «surcharges» n'ont pas d'importance, puisqu'ils ne sont pas appelés, donc l'avertissement de PyCharm sur '__init__' manquant est probablement faux [mon point # 3]. Cela me laisse toujours aveC# 1: comment écrire réellement la seule définition d'implémentation dans ce cas, étant donné le nombre différent de paramètres? Je ne peux que penser à devoir utiliser: '__init __ (self, * args, ** kwargs)' --- est-ce la bonne approche? – JonBrave