【问题标题】:Python - Why does __str__ want something returned when it called? I have print functions inside of __str__Python - 为什么 __str__ 想要在调用时返回一些东西?我在 __str__ 中有打印功能
【发布时间】:2014-02-17 08:15:18
【问题描述】:

我正在用 python 构建一个简单的类。我已经定义了我自己的 __str__ 方法,当我在类的实例上调用 print 时应该可以很好地工作。当我创建该类的一个实例并在其上调用 print 时,我收到一个错误:

TypeError: __str__ returned non-string (type NoneType)

我理解这个错误,它告诉我函数没有返回任何东西(它返回了None

class Car(object):

    def __init__(self, typ, make, model, color, year, miles):
        self.typ = typ
        self.make = make
        self.model = model
        self.color = color.lower()
        self.year = year
        self.miles = miles

    def __str__(self):
        print('Vehicle Type: ' + str(self.typ))
        print('Make: ' + str(self.make))
        print('Model: ' + str(self.model))
        print('Year: ' + str(self.year))
        print('Miles: ' + str(self.miles))
        #return ''  # I can avoid getting an error if I un-comment this line

bmw = Car('SUV', 'BMW', 'X5', 'silver', 2003, 12030)
print bmw

如您所见,我的__str__ 函数包含我想要的所有打印语句。我不需要它返回任何东西。这是我想要的输出。

Vehicle Type: SUV
Make: BMW
Model: X5
Year: 2003
Miles: 12030

我怎样才能得到这个输出? 我已经尝试这样做以避免打印错误,但错误仍然出现:

def __str__(self):
    try:
        print('Vehicle Type: ' + str(self.typ))
        print('Make: ' + str(self.make))
        print('Model: ' + str(self.model))
        print('Year: ' + str(self.year))
        print('Miles: ' + str(self.miles))
    except:
        pass

【问题讨论】:

  • __str__ 用于str 用于获取文本表示。你总是想打印这个表示,你希望它返回这个表示,以便人们可以用它做其他事情:将它嵌入到其他文本中,将其写入一个文件(不重定向标准输出),对其进行字符串操作,将其存储在数据结构中以备后用等。它应该被打印出来,就像print(vehicle)一样简单,因为@987654332 @呼叫str。返回文本表示比打印它更通用。

标签: python class python-2.7 return


【解决方案1】:

你必须创建一个大字符串并让函数返回它:

def __str__(self):
    result = 'Vehicle Type: ' + str(self.typ) # just the start, append everything else to this string
    return result

str 方法用于创建要打印的字符串,而不是用于打印本身。这是在您调用 str(object) 时隐式完成的。

【讨论】:

    【解决方案2】:

    因为这就是您要覆盖的__str__ 的定义方式。如果您不想返回字符串,请使用其他方法。

    【讨论】:

      【解决方案3】:

      根据__str__ 文档,

      由 str() 内置函数和 print 语句调用 计算对象的“非正式”字符串表示。这 与 repr() 的不同之处在于它不必是有效的 Python 表达式:可以使用更方便或更简洁的表示 反而。 返回值必须是字符串对象。

      所以,__str__ 返回的值必须是一个字符串,在你的情况下,你什么都不返回,所以 Python 默认返回 None

      您可以通过简单地更改__str__ 函数来获得所需的输出,如下所示

      def __str__(self):
          return "Vehicle Type: {}\nMake: {}\nModel: {}\nYear: {}\nMiles: {}" \
              .format(self.typ, self.make, self.model, self.year, self.miles)
      

      【讨论】:

        【解决方案4】:

        __str__ 方法通常返回对象的人类可读字符串表示。您应该在 __str__ 方法中构建一个字符串并稍后打印它:

        def __str__(self):
            return "Vehicle type: {self.typ}\nMake: {self.make}\nModel: {self.model}\nYear: {self.year}\nMiles: {self.miles}".format(self=self)
        
        bmw = Car('SUV', 'BMW', 'X5', 'silver', 2003, 12030)
        print str(bmw)
        

        【讨论】:

          【解决方案5】:

          必须__str__ 返回一个字符串,因为您正在覆盖自定义类的基类中的一个方法,因此您需要尊重它的合同、签名或任何您想要的调用规定__str__ 的约束不接受任何参数并返回一个字符串对象。

          除了这个简单的面向对象的概念,如果你在吹嘘自己需要从任何地方返回任何东西之前抓住自己,那就太好了,还有另一个基本的编程概念,你应该开始熟悉:模型逻辑与 I/O 的分离。永远不要用print 语句污染某些模型类:让它保存与该数据正确相关的数据和行为,并允许用户界面任务(例如在屏幕上打印某些内容)由应用程序中的其他实体执行。

          【讨论】:

            【解决方案6】:

            虽然这里给出的许多答案都是正确的,但这正是我们所需要的。 请记住,Slybookz 没有您的支持。

               def __str__(self):
                  return "Year: " + str(self.year_made) + ", VIN: " + str(self.car_vin)
                
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-10-04
              • 2016-07-05
              • 2023-03-04
              • 2013-11-25
              • 1970-01-01
              • 2020-02-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多