Python - 为什么__str__需要在调用时返回的内容?我在__str__里面有打印功能

时间:2014-01-26 14:48:00

标签: python class python-2.7 return

我正在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

6 个答案:

答案 0 :(得分:6)

根据__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)

答案 1 :(得分: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 :(得分:1)

__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)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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