Python 2.7.3のthreading-moduleのThreadをサブクラス化すると、奇妙な動作が発生しました。test.pyと呼ばれる次のコードを考えてみましょう。
import threading
def target_function(): print 'Everything OK'
class SpecificThread(threading.Thread):
def run(self):
try:
if self.__target:
self.__target(*self.__args, **self.__kwargs)
finally:
# Avoid a refcycle if the thread is running a function with
# an argument that has a member that points to the thread.
del self.__target, self.__args, self.__kwargs
def check():
thread = SpecificThread(target=target_function)
#thread = threading.Thread(target=target_function)
thread.run()
print thread.name, 'is running:', thread.is_alive()
このコードは、check()の実行時に次のエラーを発生させます。
>>> check()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 18, in check
thread.run()
File "test.py", line 13, in run
del self.__target, self.__args, self.__kwargs
AttributeError: _SpecificThread__target
ただし、SpecificThreadのrun()メソッドは、元のthreading.pyモジュールのコードとまったく同じです。threading.Threadが使用されている場合、またはSpecificThreadがrun()メソッドを上書きしない場合、スクリプトは問題なく実行されます。Pythonのドキュメントに上書きが許可されていると記載されていることを考えると、上書きが機能しない理由がわかりません。
ありがとう!