我有一个python类,它有一个方法。我想在此方法中定义属性,我想将列表的项目分配给此属性,但它不允许我:
class ReaderThread(threading.Thread):
def __init__(self, telex_path, ac_types):
threading.Thread.__init__(self)
self.message = [1,2,3]
def calculate(self):
self.message_type, self.new_date, self.old_code = self.message
它说:
AttributeError: 'ReaderThread' object has no attribute 'message_type'
回溯:
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
self.run()
File "Q:\Users\myuser\workspace\new\scriptt.py", line 89, in run
self.calculate()
File "Q:\Users\myuser\workspace\new\scriptt.py", line 93, in calculate
self.message_type, self.new_date, self.old_code,
AttributeError: 'ReaderThread' object has no attribute 'message_type'
上面有什么问题?
答案 0 :(得分:1)
问题很难准确描述,因为它实际上并没有出现在您向我们展示的代码中。但我可以猜测你的实际代码是什么,并解释如何解决这个问题。
追溯说明了这一点:
File "Q:\Users\myuser\workspace\new\scriptt.py", line 93, in calculate
self.message_type, self.new_date, self.old_code,
AttributeError: 'ReaderThread' object has no attribute 'message_type'
但是你的代码中没有这样的行。最接近的是:
self.message_type, self.new_date, self.old_code = self.message
该行完全有效 - 它正在尝试设置 message_type
。
您收到错误的行不是尝试设置它,它只是尝试访问它。由于还没有这样的属性,因此您得到AttributeError
。
几乎可以肯定,在您的实际代码中,您正在执行以下操作:
self.message_type, self.new_date, self.old_code,
self.other_attribute, self.fifth_attribute = self.message
这可能看起来像一个单一的陈述,与你向我们展示的例子完全相同 - 但事实并非如此。 Python(与C或JavaScript不同)对于语句何时继续到下一行有非常严格的规则,而在任何其他情况下,该行的结尾都是语句结束时段。
第一行是一个完整的语句:一个简单的表达式语句,其中表达式是三个值的元组。正如您可以在交互式解释器中的一行上编写1, 2, 3
或1, 2, 3,
并查看(1, 2, 3)
,您可以编写self.message_type, self.new_date, self.old_code,
并评估为元组{{1} }}。通常情况下,您的代码无用且具有误导性,但无害;在这种情况下,由于您尚未实际创建这些属性,因此您将获得(self.message_type, self.new_date, self.old_code)
。
第二行当然是一个正常的赋值语句,它会将AttributeError
解包为self.message
和self.other_attribute
(可能会因为有太多元素需要解包而引发self.fifth_attribute
,但你永远不会那么远。)
当表达式在下一行继续时,最简单和最常见的规则是当有未闭合的括号,方括号或大括号时。你可以在这里利用它,因为你实际上正在做的是分配一个元组,*和元组总是写在括号内。所以:
ValueError
*我在解释中有点作弊,因为作业左侧的东西不是真正的表达式,特别是不是真正的元组,而是作业目标列表 。但规则经过精心设计,以确保目标列表形式是表达形式的明确子集。有关确切的语法,请参阅参考文档中的assignment statements。