6

以下に非常によく似たコードサンプルがあります

import threading
import datetime
import time
import sys

class FirstClass(object):
    def __init__(self):
        print 'initialized'

class ThreadClass(FirstClass, threading.Thread):
    def __init__(self):
        super(ThreadClass, self).__init__()
        print 'initialized2'

    def run(self):
        time.sleep(1)
        now = datetime.datetime.now()
        sys.stdout.write("%s says Hello World at time: %s \n" % (self.getName(), now))

for i in range(20):
    t = ThreadClass()
    t.start()

Python の call-next-method が原因で、FirstClass とスレッドの両方の init メソッドを実行できません。この問題を解決する別の方法はありますか?

4

1 に答える 1

4

イニシャライザも呼び出す必要がありますsuper(FirstClass, self).__init__()FirstClass.__init__()

使用の要点はsuper()、呼び出しを親協同組合に渡すことです。特定の MROFirstClassでは の前にリストされているため、MROthreading.Threadの次の順序で明示的に呼び出すことなく、呼び出されることはありません。__init__threading.Thread.__init__()

このコンテキストでどのように機能するかについて、Raymond Hettinger による優れた PyCon 2015 プレゼンテーションをご覧になることをお勧めします。super()

于 2012-11-14T14:36:49.260 に答える