2012-11-27 99 views
4

我正试图更好地理解__str__函数的正确用法。 比方说,我有在游戏中使用一个非常简单的类称为字符,看起来像这样:更好地理解__str__用法

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__的良好用法的一些例子是什么?我提供的例子是否可以使用该功能?

回答

6

打印统计信息是__str__()的优良用法。只需使用字符串格式化返回一个字符串值:

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

这非常有帮助,同时教我新的东西。我对'format(** self .__ dict __)'不熟悉',但是在我的应用程序中测试过它,它像一个魅力一样工作。我以前没有遇到像这样的字符串格式化(不使用'%s'或'%d')。现在我要了解更多关于这段代码的信息。 –

+2

请注意,如果类定义了'__slots__',则这不起作用。这绝对是一个角落案例,但是如果你处理了__slots__'启用(受限制的)类,那么这些信息是值得了解的。这个答案的另一个很酷的特性是python自动连接字符串:)。 – mgilson

+0

如果该类确实使用了__slots__,那么相应的片段就是'...).format(name = self.name,poisoned = self.poisoned)'。 –

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

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

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

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

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

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