我有一个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
上面写着:
^{pr2}$回溯:
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'
上面怎么了?在
这个问题很难准确描述,因为它实际上并没有出现在您展示给我们的代码中。但我可以猜测您的实际代码是什么样子的,并解释如何修正这种猜测。在
回溯显示:
但你的代码中没有这样的行。最接近的是:
^{pr2}$这一行是完全有效的,它试图设置
message_type
。在你得到的一个错误并不是要设置它,它只是试图访问它。由于还不存在这样的属性,您将得到一个
AttributeError
。在几乎可以肯定的是,在您的实际代码中,您正在做这样的事情:
在您看来,这可能像是一个语句,与您向我们展示的示例完全相同,但事实并非如此。Python(与C或JavaScript不同)对语句何时继续到下一行有非常严格的规则,在任何其他情况下,行尾是语句的结尾,句点。在
第一行是一个完整的语句:一个简单的表达式语句,其中表达式是由三个值组成的元组。正如您可以在交互式解释器中的一行上写}。通常,您的代码将是无用的和误导性的,但无害;在这种情况下,因为您还没有实际创建这些属性,您将得到一个
1, 2, 3
或1, 2, 3,
,并查看(1, 2, 3)
,您可以编写self.message_type, self.new_date, self.old_code,
,它将计算为元组{AttributeError
。在第二行当然是一个普通的赋值语句,它将把}(可能会因为有太多的元素需要解压而引发一个{},但你永远不会走到这一步)。在
self.message
解压为self.other_attribute
和{当表达式在下一行继续时,最简单也是最常见的规则是有未闭合的圆括号、方括号或大括号。你可以在这里利用它,因为你所做的就是给一个元组赋值,*元组总是可以写在括号里。所以:
*我在解释中有点作弊,因为赋值左边的东西不是真正的表达式,特别不是元组,而是赋值目标列表。但是这些规则是经过精心设计的,以确保目标列表表单是表达式表单的一个明确子集。请参阅参考文档中的assignment statements以了解确切的语法。在
相关问题 更多 >
编程相关推荐