[英]__str__ outputs “instance at 0x00E4F558”
這是我第一次在這個網站上尋求幫助。 我在這里尋找答案,但沒有什么能真正為我清除。
我正在努力學習Python。 我在“課堂”一章。 以下代碼:
class Character:
def __init__(self, name, initial_health):
self.name = name
self.health = initial_health
self.inventory = []
def __str__(self):
s = "Name: " + self.name
s += "| Health: " + str(self.health)
s += "| Inventory: " + str(self.inventory)
return s
def grab(self, item):
self.inventory.append(item)
me = Character("vic", 37)
me.grab("pencil")
me.grab("paper")
print str(me)
...生產:
Name: vic| Health: 37| Inventory: ['pencil', 'paper']
但是下面的代碼,在我看來非常相似,打印出內存位置而不是變量本身:
import random
SUITS = ['C', 'S', 'H', 'D']
RANKS = ['A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K']
VALUES = {'A':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'T':10, 'J':10, 'Q':10, 'K':10}
# define card class
class Card:
def __init__(self, suit, rank):
if (suit in SUITS) and (rank in RANKS):
self.suit = suit
self.rank = rank
self.value = self.get_value()
else:
print "Invalid card: " + str(suit) + str(rank)
def __str__(self):
return str(self.suit) + str(self.rank)
def get_cardDetails(self):
return self.suit + self.rank + ": " + str(self.value)
def get_suit(self):
return self.suit
def get_rank(self):
return self.rank
def get_value(self):
value = VALUES[self.rank]
return value
class Hand:
def __init__(self, card1, card2):
self.cardCount = 0
self.cards = []
self.cards.append(card1)
self.cardCount += 1
self.cards.append(card2)
self.cardCount += 1
self.value = self.get_value()
print "Dealed hand: " + str(self.cards[0]) + str(self.cards[1])
print "Dealed hand: " + str(self.cards)
def __iter__(self):
return iter(self.cards)
def __str__(self):
return str(self.cards)
def get_details(self):
print "Hand: "
for each in self.cards:
print " -" + str(each) + ": " + str(each.value)
s = "Cards: " + str(self.cardCount) + \
" | Hand: " + str(self.cards) + \
" | Total Value: " + str(self.value) + " |"
return s
def add_card(self, card):
self.cards.append(card)
self.cardCount += 1
self.value = self.get_value()
print "Added: " + str(card)
def get_value(self):
value = 0
for each in self.cards:
value = value + each.value
return value
c1 = Card("C", "2")
c2 = Card("C", "3")
h = Hand(c1, c2)
print str(h)
輸出:
Dealed hand: C2C3
Dealed hand: [<__main__.Card instance at 0x00E4F558>, <__main__.Card instance at 0x00E543C8>]
[<__main__.Card instance at 0x00E4F558>, <__main__.Card instance at 0x00E543C8>]
我敢肯定我必須在這里遺漏一些東西 - 畢竟我只是在學習這個。 任何幫助將不勝感激。 提前致謝。 抱歉這篇長篇文章。
列表的__str__
方法在列表的元素上調用__repr__
,而不是__str__
。 您可以遍歷列表,將元素轉換為自己的str,或者編寫一個Hand類,從列表中__str__
子類,並定義__str__
以在其元素上調用__str__
。
這取決於你要打印的內容。 在Python中,如果要打印對象,則首先通過評估a.__str__()
a
其轉換為字符串。 如果您的類定義了__str__
方法,Python會使用它。 否則它使用來自object
的__str__
方法(在新樣式類和Python 3.x中)。
無論如何打印對象的方式取決於__str__
方法的實現方式。 如果你正在評估str(els)
,其中els
是一個列表,那么Python實際上調用List.__str__(lis)
並且這個函數以這樣的方式實現,即打印包含在其中的對象的repr
。 (並且函數repr
默認返回如您所見的輸出。)
如果要使用str
方法的對象,可以編寫:
[str(el) for el in els]
其中els
是您的對象列表。
列表打印其元素的repr()
,而不是str()
。 加:
__repr__ = __str__
到你的Card
類定義。 這將使您的Card
類的repr()
與它的str()
相同,並且列表將按照您的預期打印您的卡片。
你可以__str__
Hand
的__str__
來獲取str()
而不是列表項的repr()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.