更好地理解__str__的用法

时间:2012-11-27 21:15:07

标签: python function methods python-3.x

我正在努力更好地理解__str__函数的正确用法。 假设我有一个非常简单的名为Character的类,用于一个看起来像这样的游戏:

class Character(object):
""" A game character. """
def __init__(self, name):
    self.name = name
    self.poisoned = False
    self.strength = random.randrange(10, 20)
    self.max_strength = self.strength
    self.dexterity = random.randrange(10, 20)
    self.max_dexterity = self.dexterity
    self.hit_points = 100
    self.spell_points = 100
    self.weapon = []
    self.spell = []
    self.items = []
    self.aura = []
    self.xp = 0

在了解__str__函数之前,我会定义一个名为print_stats(self)的类的方法,它将通过Character.print_stats()打印字符统计信息。在了解了__str__之后,虽然看起来这是一个定义和显示对象统计数据的函数,类似于我对print_stats(self)的处理方式...但是在玩它时学习了返回值必须是一个字符串而不包含整数,看来我的假设是错误的。

所以现在我的问题是如何正确使用__str__的一些例子?我提供的示例会从使用该功能中获益吗?

5 个答案:

答案 0 :(得分:8)

打印统计数据可以很好地使用__str__()。只需使用字符串格式返回单个字符串值:

def __str__(self):
    return ('Name: {name}\n'
        'Poisoned: {poisoned}\n'
        # etc.
    ).format(**self.__dict__)

答案 1 :(得分:3)

存在

__str__,以便您可以获取对象的字符串表示形式。请注意,内置print函数/语句隐式调用str

print 1

与:

完全相同
print str(1)

与:

相同
print (1).__str__()

因为打印隐式调用__str__


现在到你的班级 - 最自然的事情就是如果你写的那样:

print self.foo,self.bar,self.baz

您可以将__str__定义为:

def __str__(self):
    return " ".join(str(x) for x in (self.foo,self.bar,self.baz))

现在打印角色的统计数据,您只需:

print character  #same as `print str(character)` :)

通常这有点受限,因此通过.format(或使用%运算符的旧“sprintf”样式格式)存在字符串格式。

def __str__(self):
    return "my {foo} went to the {baz} to buy a {bar}".format(foo=self.foo,
                                                              baz=self.baz,
                                                              bar=self.bar)

答案 2 :(得分:1)

def __str__(self):
  return 'Name: %s, Hit points: %d' % (self.name, self.hit_points)

答案 3 :(得分:1)

返回值必须是一个字符串,但它可以是任何字符串,包括一个包含整数字符串表示形式的字符串。一个简单的例子:

def __str__(self):
  return "%s (strength: %i)" % (self.name, self.strength)

这可能会返回"Arthur (strength: 42)"

之类的内容

答案 4 :(得分:1)

在基本用例中,__str__()print_stats()之类的方法可以非常安全地互换。但是,特别是对于像游戏中的角色这样的东西,您可能想要使用print_stats(),因为您将无法重构__str__()来执行将数据打印到屏幕上的操作(在图形桌面或Web应用程序的上下文,或者接受参数,这可能对此类事情有用。