7

python3 には簡単なプログラムがあります。

from PyQt4 import QtCore
import PyQt4

class Bar(object):
    def __init__(self):
        print("Bar start")
        super(Bar, self).__init__()
        print("Bar end")

class FakeQObject(object):
    def __init__(self):
        print("FakeQObject start")
        super(FakeQObject, self).__init__()
        print("FakeQObject end")

class Foo(QtCore.QObject, Bar):
#class Foo(FakeQObject, Bar):
    def __init__(self):
        print("Foo start")
        super(Foo, self).__init__()
        print("Foo end")


print(Foo.__mro__)
print(PyQt4.QtCore.PYQT_VERSION_STR)
f = Foo()

a) クラス Foo が QtCore.QObject および Bar から継承すると、次のようになります。

(<class '__main__.Foo'>, <class 'PyQt4.QtCore.QObject'>, <class 'sip.wrapper'>, <class 'sip.simplewrapper'>, <class '__main__.Bar'>, <class 'object'>)
4.9.4
Foo start
Foo end

b) クラス Foo が FakeQObject および Bar から継承すると、次のようになります。

(<class '__main__.Foo'>, <class '__main__.FakeQObject'>, <class '__main__.Bar'>, <class 'object'>)
4.9.4
Foo start
FakeQObject start
Bar start
Bar end
FakeQObject end
Foo end

問題は、なぜ a) の場合、Bar init が呼び出されないのかということです。

同様の質問 here pyQt4 and inheritanceを見つけましたが、良い答えはありません。

前もって感謝します!

4

1 に答える 1

3

@nneonneo と一緒に、私はそれQtCore.QObjectが協同組合を使用していないのではないかと疑っていますsuper.__init__。もしそうなら、あなたはこの問題を抱えていないでしょう。

ただし、ある時点で、基本クラスの 1 つが協調的なスーパーを使用できないことに注意する必要がありますobject。これは、メソッドがないためです。検討:

class Base():
    def __init__(self):
        print("initializing Base")
        super().__init__()
    def helper(self, text):
        print("Base helper")
        text = super().helper(text)
        text = text.title()
        print(text)

class EndOfTheLine():
    def __init__(self):
        print("initializing EOTL")
        super().__init__()
    def helper(self, text):
        print("EOTL helper")
        text = super().helper(text)
        return reversed(text)

class FurtherDown(Base, EndOfTheLine):
    def __init__(self):
        print("initializing FD")
        super().__init__()
    def helper(self, text):
        print(super().helper(text))

test = FurtherDown()
print(test.helper('test 1 2 3... test 1 2 3'))

そして出力:

initializing FD
initializing Base
initializing EOTL
Base helper
EOTL helper
Traceback (most recent call last):
  File "test.py", line 28, in <module>
    print(test.helper('test 1 2 3... test 1 2 3'))
  File "test.py", line 25, in helper
    print(super().helper(text))
  File "test.py", line 7, in helper
    text = super().helper(text)
  File "test.py", line 17, in helper
    text = super().helper(text)
AttributeError: 'super' object has no attribute 'helper'

したがって、どちらのクラスが行末になるとしても、 を呼び出さない必要がありますsuperQtオーバーライドしたいメソッドが他にもあるため、Qtそのクラスはクラス ヘッダーの最後のメソッドである必要があります。__init__協調的なスーパーを使用しないことで、Qt他のメソッドがオーバーライドされたときにバグを回避できます。

于 2012-10-12T19:48:37.753 に答える