如何在python的类方法中解压缩列表的内容?

时间:2014-02-18 09:35:34

标签: python class attributes

我有一个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'

上面有什么问题?

1 个答案:

答案 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, 31, 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.messageself.other_attribute(可能会因为有太多元素需要解包而引发self.fifth_attribute,但你永远不会那么远。)


当表达式在下一行继续时,最简单和最常见的规则是当有未闭合的括号,方括号或大括号时。你可以在这里利用它,因为你实际上正在做的是分配一个元组,*和元组总是写在括号内。所以:

ValueError

*我在解释中有点作弊,因为作业左侧的东西不是真正的表达式,特别是不是真正的元组,而是作业目标列表 。但规则经过精心设计,以确保目标列表形式是表达形式的明确子集。有关确切的语法,请参阅参考文档中的assignment statements