更好地理解__str__的用法

Vin*_*eau 5 python methods function 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
Run Code Online (Sandbox Code Playgroud)

在学习该__str__函数之前,我会定义一个被调用的类的方法print_stats(self),它将打印字符统计信息Character.print_stats().在了解之后__str__,似乎这是一个定义和显示对象统计信息的函数,类似于我将要做的print_stats(self)...但是在使用它并了解返回的值必须是字符串而不包含整数,看来我的假设是错误的.

所以现在我的问题是什么样的好用法__str__?我提供的示例会从使用该功能中获益吗?

Mar*_*ers 8

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

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

  • 这非常有帮助,同时也教会了我一些新东西。我不熟悉“format(**self.__dict__)”,但在我的应用程序中测试了它,它的效果非常好。我以前没有遇到过这样的字符串格式(没有使用“%s”或“%d”。)现在我要了解有关该代码片段的更多信息。 (2认同)
  • 需要注意的是,如果类定义了`__slots__`,则不起作用.这绝对是一个极端的案例,但如果你曾经处理过`__slots__`启用(受限制的?)类,那么这是一个值得了解的信息.这个答案的另一个很酷的事情是python做的自动字符串连接:). (2认同)