4

以下のコードを実行すると、次のエラーが発生する理由がわかります。

Traceback (most recent call last):
  File "C:\pytests\mthread1.py", line 25, in <module>
    thread1 = myThread(1, "Thread-1", 1)
  File "C:\pytests\mthread1.py", line 9, in __init__
    self.name = name
AttributeError: 'myThread' object has no attribute '_initialized'

コード:

import time
import threading

exitFlag = 0

class myThread(threading.Thread):
        def __init__(self, threadID, name, counter):
            self.threadID = threadID
            self.name = name
            self.counter = counter
            threading.Thread.__init__(self)
        def run(self):  
            print("Starting ", self.name)
            print_time(self.name, self.counter, 5)
            print("Exiting ", self.name)

def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            thread.exit()
        time.sleep(delay)
        print("{}: {}" . format(threadName, time.ctime(time.time())))
        counter -= 1

thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

thread1.start()         
thread2.start()         

print("Exiting Main Thread") 
4

1 に答える 1

6

ドキュメントによると、それは簡単です:

スレッドには名前があります。名前はコンストラクターに渡され、name属性を介して読み取ったり変更したりできます。

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})

そのため、クラスコンストラクターを使用して、特定の方法で設定されることが予想される属性を設定しようとしています。実際、Threadクラスのソースコードを確認すると:

@property
def name(self):
    assert self._initialized, "Thread.__init__() not called"
    return self._name

@name.setter
def name(self, name):
    assert self._initialized, "Thread.__init__() not called"
    self._name = str(name)

Thread.__init__(name=name)変更する必要があるのはすべて-少し前に電話してください:

class myThread(threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self, name=name)
        self.threadID = threadID
        self.counter = counter
于 2013-03-09T22:14:50.933 に答える