2012-11-27 53 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上下文中應用程序),或者採取參數,這可能對這樣的事情有用。