无法从 class 打印 __str__

Can't print __str__ from the class

我想知道如何打印特定索引的 class 内容。我制作了一个 class,它具有特定地震运动的所有值,并将每个值存储在自己的数据类型中。

这里是 class:

import re

class Txt_data:
       
    def __init__(self, result):
    
        self.date = result[0]
        self.time = result[1]
        self.latit = result[2]
        self.long = result[3]
        self.depth = result[4]
        self.md = result[5]
        self.ml = result[6]
        self.mw = result[7]
        self.region = result[8]
        self.method = result[9]    
  
    def date(self):
        return self._date

  
    def time(self):
        return self._time

  
    def latit(self):
        return self._latit

  
    def long(self):
        return self._long

  
    def depth(self):
        return self._depth

  
    def md(self):
        return self._md

  
    def ml(self):
        return self._ml

  
    def mw(self):
        return self._mw

  
    def region(self):
        return self._region

  
    def method(self):
        return self._method        

    # This does not work 
    def __str__(self):
        return ('MAG: ' + float(self.ml()) + ' DEPTH: ' + int(self.region()) + ' DATE/TIME: ' + str(self.date()) + ' ' + str(self.time()) + ' LAT: ' + float(self.latit()) + ' LON: ' + float(self.long()))

result = [('2021.12.02', '22:29:24', '36.9605', '28.1775', '13.0', '-.-', '1.5', '-.-', 'KARACA-MARMARIS (MUGLA)', ' Quick')]


print(Txt_data(result))

我试图使用 str 方法打印数据,但它不起作用。

这是错误:

Traceback (most recent call last):
  File "/Users/seyfalsultanov/Documents/uni comp 100/comp100-2021f-ps5-seyfalku/main.py", line 73, in <module>
    print(Txt_data(result))
  File "/Users/seyfalsultanov/Documents/uni comp 100/comp100-2021f-ps5-seyfalku/main.py", line 60, in __str__
    print('MAG: ' + float(self.ml()) + ' DEPTH: ' + int(self.region()) + ' DATE/TIME: ' + str(self.date()) + ' ' + str(self.time()) + ' LAT: ' + float(self.latit()) + ' LON: ' + float(self.long()))
AttributeError: Txt_data instance has no __call__ method

我的问题是如何打印我尝试在 class 中使用 str 方法打印的字符串。 非常感谢。

您的直接问题是您使用实例属性隐藏了所有方法,而不是使用 _ 前缀名称作为方法期望的属性。

def __init__(self, result):

    self._date = result[0]
    self._time = result[1]
    self._latit = result[2]
    self._long = result[3]
    self._depth = result[4]
    self._md = result[5]
    self._ml = result[6]
    self._mw = result[7]
    self._region = result[8]
    self._method = result[9]    

但是,其中 none 个 getter 是必需的;直接使用实例属性即可。在 __str__ 中,使用 f 字符串执行任何必要的类型转换(您目前做错了;非 str 值需要转换为 str 值,而不是其他方式左右)。

class Txt_data:
       
    def __init__(self, result):
    
        self.date = result[0]
        self.time = result[1]
        self.latit = result[2]
        self.long = result[3]
        self.depth = result[4]
        self.md = result[5]
        self.ml = result[6]
        self.mw = result[7]
        self.region = result[8]
        self.method = result[9]    
  
    def __str__(self):
        return f'MAG: {self.ml} DEPTH: {self.region} DATE/TIME: {self.date} {self.time} LAT: {self.latit} LON: {self.long}'



result = ('2021.12.02', '22:29:24', '36.9605', '28.1775', '13.0', '-.-', '1.5', '-.-', 'KARACA-MARMARIS (MUGLA)', ' Quick')
print(Txt_data(result))

最后,我建议让 __init__ 负责拆分列表。让它简单地接受 10 个不同的参数,并使用专用的 class 方法以固定格式解析列表。

class Txt_data:
       
    def __init__(self, date, time, latitude, long, depth, md, ml, mw, region, method):
    
        self.date = date
        self.time = time
        self.latit = latit
        self.long = long
        self.depth = depth
        self.md = md
        self.ml = ml
        self.mw = mw
        self.region = region
        self.method = method

    @classmethod
    def from_list(cls, x):
        if len(x) != 10:
            raise ValueError("Wrong number of elements in list")
        return cls(*x)
  
    def __str__(self):
        return f'MAG: {self.ml} DEPTH: {self.region} DATE/TIME: {self.date} {self.time} LAT: {self.latit} LON: {self.long}'