5

我试图更好地理解该__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__?我提供的示例是否会从使用该功能中受益?

4

5 回答 5

8

打印统计数据是__str__(). 只需使用字符串格式来返回单个字符串值:

def __str__(self):
    return ('Name: {name}\n'
        'Poisoned: {poisoned}\n'
        # etc.
    ).format(**self.__dict__)
于 2012-11-27T21:17:18.640 回答
3

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

print 1

与以下内容完全相同:

print str(1)

这与以下内容相同:

print (1).__str__()

因为 print__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)
于 2012-11-27T21:18:01.633 回答
1
def __str__(self):
  return 'Name: %s, Hit points: %d' % (self.name, self.hit_points)
于 2012-11-27T21:16:54.593 回答
1

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

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

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

于 2012-11-27T21:17:02.533 回答
1

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

于 2012-11-27T21:22:51.747 回答