2012-07-22 15 views
7

Also ... Ich arbeite an dem Versuch, von Basic Python zu einigen GUI-Programmierung zu verschieben, mit PyQt4. Ich schaue mir ein paar verschiedene Bücher und Tutorials an, und beide scheinen eine etwas andere Art zu haben, die Klassendefinition zu beginnen.Verschiedene Arten der Verwendung von __init__ für PyQt4

Ein Tutorial beginnt die Klassen wie folgt:

class Example(QtGui.QDialog): 
    def __init__(self): 
     super(Example, self).__init__() 

Ein weiteres Buch tut es wie folgt aus:

class Example(QtGui.QDialog): 
    def __init__(self, parent=None): 
     super(Example, self).__init__(parent) 

Und noch eine andere tut es so aus:

class Example(QtGui.QDialog): 
    def__init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 

I Ich versuche immer noch, meine Gedanken um Klassen und OOP und super() und alle ... Ich bin richtig zu denken dass die letzte Zeile des dritten Beispiels mehr oder weniger die gleiche Funktion erfüllt wie die Aufrufe mit super() in den vorherigen, indem die Basisklasse explizit direkt aufgerufen wird? Für relativ einfache Beispiele wie diese, d. H. Einzelvererbung, gibt es irgendeinen wirklichen Vorteil oder einen Grund, einen Weg gegenüber dem anderen zu verwenden? Endlich ... das zweite Beispiel übergibt parent als Argument an super() während der erste nicht ... irgendwelche Vermutungen/Erklärungen, warum/wann/wo das wäre angemessen?

Antwort

8

Die erste unterstützt einfach nicht die Übergabe eines parent Arguments an seine Basisklasse. Wenn Sie wissen, dass Sie die parent Arg nie brauchen werden, ist das in Ordnung, aber das ist weniger flexibel.

Da dieses Beispiel nur eine einzelne Vererbung hat, ist super(Example, self).__init__(parent) genau dasselbe wie QtGui.QDialog.__init__(self, parent); die früheren Verwendungen super eine „Version“ self erhalten, die QtGui.QDialog ‚s Methoden statt Example‘ s Calles, so dass self automatisch enthalten ist, während die letztere direkt die Funktion QtGui.QDialog.__init__ und explizit aufruft übergibt die self und parent Argumente. Bei der Einzelvererbung gibt es keinen anderen Unterschied als den Typ der Eingabe und die Tatsache, dass Sie den Klassennamen ändern müssen, wenn Sie die Vererbung ändern. Bei Mehrfachvererbung löst super Methoden semi-intelligent auf.

Das dritte Beispiel verwendet tatsächlich QWidget anstelle von QDialog, was ein wenig seltsam ist; vermutlich funktioniert das, weil QDialog eine Unterklasse von QWidget ist und in seiner __init__ nichts Sinnvolles tut, aber ich weiß es nicht genau.

+0

Sie sind eine * schnelle * Antwort Typer - weit vor mir – Hubro

+1

@ Codemonkey 7 Minuten nach der Frage wurde gefragt, nicht * das * schnell. :) – Dougal

Verwandte Themen