7

だから...私は、PyQt4を使用して、基本的なPythonからいくつかのGUIプログラミングに移行しようとしています。私はいくつかの異なる本とチュートリアルを見ていますが、それらはそれぞれ、クラス定義を開始する方法がわずかに異なるようです。

1 つのチュートリアルは次のようにクラスから始まります。

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

別の本では、次のように説明しています。

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

そして、さらに別の方法でそれを行います:

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

私はまだクラスと OOP について頭を悩ませようとしていsuper()ます... 3 番目の例の最後の行は、前の例での呼び出しとほぼ同じことを、super()明示的に基本クラスを直接呼び出しますか? これらのような比較的単純な例、つまり単一継承の場合、一方の方法と他方の方法を比較して使用する本当の利点や理由はありますか? 最後に... 2番目の例はparent引数として渡されますがsuper()、最初の例はそうではありません...なぜ/いつ/どこでそれが適切かについての推測/説明はありますか?

4

1 に答える 1

8

parent最初のものは、基本クラスに引数を渡すことをサポートしていません。引数が必要ないことがわかっている場合はparent問題ありませんが、柔軟性が低下します。

この例は単一継承しかないため、super(Example, self).__init__(parent)とまったく同じQtGui.QDialog.__init__(self, parent)です。前者はのメソッドの代わりに のメソッドを呼び出すsuper「バージョン」を取得するために使用するため、自動的に含まれますが、後者は関数を直接呼び出し、および引数を明示的に渡します。単一継承では、タイピングの量と、継承を変更する場合はクラス名を変更する必要があるという事実以外に違いはありません。多重継承では、メソッドをセミインテリジェントに解決します。selfQtGui.QDialogExampleselfQtGui.QDialog.__init__selfparentsuper

3 番目の例では実際にQWidget代わりに を使用していますがQDialog、これは少し奇妙です。QDialogは のサブクラスでQWidgetあり、その で意味のあることを何もしないため、おそらく機能し__init__ますが、確かなことはわかりません。

于 2012-07-22T02:50:59.253 に答える