__str__输出"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__

这取决于您要打印的内容。在Python中,如果打印对象a,则首先通过计算a.__str__()将其转换为字符串。如果您的类定义了方法__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()相同,并且列表将根据您的期望打印您的卡。

相反,您可以编写Hand__str__来获取列表项的str(),而不是repr()

相关内容

最新更新