如何在python的类方法中解包list的内容?

2024-06-28 11:09:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

上面怎么了?在


Tags: 方法inpyselfmessagenew属性def
1条回答
网友
1楼 · 发布于 2024-06-28 11:09:01

这个问题很难准确描述,因为它实际上并没有出现在您展示给我们的代码中。但我可以猜测您的实际代码是什么样子的,并解释如何修正这种猜测。在


回溯显示:

  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。在


几乎可以肯定的是,在您的实际代码中,您正在做这样的事情:

    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,,它将计算为元组{}。通常,您的代码将是无用的和误导性的,但无害;在这种情况下,因为您还没有实际创建这些属性,您将得到一个AttributeError。在

第二行当然是一个普通的赋值语句,它将把self.message解压为self.other_attribute和{}(可能会因为有太多的元素需要解压而引发一个{},但你永远不会走到这一步)。在


当表达式在下一行继续时,最简单也是最常见的规则是有未闭合的圆括号、方括号或大括号。你可以在这里利用它,因为你所做的就是给一个元组赋值,*元组总是可以写在括号里。所以:

(self.message_type, self.new_date, self.old_code,
 self.other_attribute, self.fifth_attribute) = self.message

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

相关问题 更多 >