0

クラスが Thread から継承されてsuper(Thread, self).__init__()いるのに、なぜ呼び出せないのか不思議です。Thread.__init__(self)問題を理解するのを手伝ってもらえますか?

#!/usr/bin/python

from threading import Thread
from Queue import Queue
class ThreadManager(object):

    def work(self, items):
        q = Queue()
        for item in items:
            q.put(item)

        print q.qsize()

        p = Worker()
        p.start()
        p.join()

class Worker(Thread):
    def __init__(self):
        # Why doesn't this work?
        #super(Thread, self).__init__()

        Thread.__init__(self)

    def run(self):
        print 'thread running'

def main():
    items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
    tm = ThreadManager()
    tm.work(items)

if __name__ == "__main__":
    main()
4

1 に答える 1

2

クラスが から継承するときのsuper(Thread, self).__init__()代わりに、なぜ呼び出せないのか不思議です。Thread.__init__(self)Thread

それはうまくいかないからsuperです。その型の次の祖先を検索できるように、独自の型を最初のパラメーターとして渡す必要があります。を渡すとThread、 の祖先を要求していますThread

親クラスが通常の新しいスタイルの Python クラスである場合、これを間違って行うと、通常、1 つの祖先クラスをスキップすることになります。これは無害であるか、動作しているように見えても実際には正しく動作しない可能性があります。ただしthreading.Thread、適切に初期化されることを確認するための特定のチェックがあるため、おそらく次のような結果が得られます。

AssertionError: Thread.__init__() was not called

親クラスが C 拡張クラスである場合、おそらく祖先はなく、実装されていsuperても実装されていない可能性が高いため、通常はそのようにもエラーが発生します。

これらすべてがどのように機能するかを理解したい場合は、 Python の super() を super と見なすことをお勧めします (上記のリンク先のドキュメントは、必ずしも最適な入門的な議論とは限らないため)。

つまり、要約すると:

super(Worker, self).__init__()
于 2013-03-01T01:47:27.400 に答える