我正在努力更好地理解__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__
的一些例子?我提供的示例会从使用该功能中获益吗?
答案 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应用程序的上下文,或者接受参数,这可能对此类事情有用。