4

これは、このサイトで助けを求める私の最初の叫びです。私はここで答えを探しましたが、本当にそれを明確にするものは何もありません。

私は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>]

私はここで何かが欠けているに違いないと確信しています - 私は結局これを学んでいます. どんな助けでも大歓迎です。前もって感謝します。そして長文失礼しました。

4

3 に答える 3

6

リストの__str__メソッドは、__repr__ではなく、リストの要素を呼び出します__str__。要素を自分で str にキャストするリストを反復処理するか、リストからサブクラス化し、その要素__str__を呼び出すように定義する Hand クラスを作成することができます。__str__

于 2013-07-12T20:25:19.327 に答える
1

それは、印刷しようとしているものによって異なります。Python では、オブジェクトを出力する場合、a最初に を評価して文字列に変換しますa.__str__()。クラスにメソッドが__str__定義されている場合、Python はそれを使用します。それ以外の場合は、(新しいスタイル クラスと Python 3.x で) __str__from メソッドを使用します。object

とにかく、オブジェクトが印刷される方法は、__str__メソッドの実装方法によって異なります。を評価str(els)している場合、elsはリストであり、Python は実際に呼び出し、この関数は内部に含まれるオブジェクトをList.__str__(lis)出力するように実装されます。repr(そして、関数reprはデフォルトでご覧のような出力を返します。)

オブジェクトstrメソッドを使用する場合は、次のように記述できます。

[str(el) for el in els]

elsオブジェクトのリストはどこにありますか。

于 2013-07-12T20:28:00.847 に答える
1

リストはrepr()、 ではなく、要素の を出力しstr()ます。追加:

__repr__ = __str__

Cardクラス定義に。これrepr()により、Cardクラスの がクラスの と同じにstr()なり、リストは期待どおりにカードを出力します。

リスト項目のではなくを取得するために、代わりに__str__ofを書くことができます。Handstr()repr()

于 2013-07-12T20:57:48.327 に答える