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

根据文档,这很简单:

线程有名称。名称可以传递给构造函数,并通过名称属性读取或更改。

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 回答