49256


pythonでカードゲームを作成しながら勉強しているのですが、前回の[質問](https://ja.stackoverflow.com/questions/49060/%E7%89%B9%E6%AE%8A%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89-gt-%E3%81%AE%E5%BC%95%E6%95%B0%E3%81%8C-self-%E3%81%AE%E4%BB%96%E3%81%AB%E4%B8%80%E3%81%A4%E3%81%97%E3%81%8B%E7%84%A1%E3%81%84%E7%90%86%E7%94%B1)で`def
__gt__(self,
c2):`のselfには自動的に第一引数とクラスの名前が入ること？を学んだのですが実際に引数selfに入った値を確認したいのですがどのようにすれば確認する事ができますか？

p1cの値が入ってると思うのですがどのように確認して良いのかわかりません。  
すごいエンジニアの方々様、お力貸して下さい。  
お願いします。

[code]

    print(self.__class__.__name__)
    実行結果：Card
    
    print(self)
    実行結果：何も出ない
    
[/code]

**ゲーム全体のコード**

[code]

    class Card(object):
        """docstring for Card"""
        suits = ['spades', 'hearts','diamonds', 'clubs']
        values = [None, None, '2', '3', '4', '5', '6', '7', '8', '9', '10',
                  'Jack', 'Queen', 'King', 'Ace']
        def __init__(self, v, s):
            self.value = v
            self.suit = s
        def __lt__(self, c2):
            if self.value < c2.value:
                return True
            if self.value == c2.value:
                if self.suit < c2.suit:
                    return True
                else:
                    return False
    
        def __gt__(self, c2):
    
            if self.value > c2.value:
                return True
            if self.value == c2.value:
                if self.suit > c2.suit:
                    return True
                else:
                    return False
        def __repr__(self):
            v = self.values[self.value] + 'of' \
                + self.suits[self.suit]
            return v
    
    # ここでトランプを生成
    # デッキから一枚カードを取り出すメソッドもある！
    class Deck:
        def __init__(self):
            self.cards = []
            for i in range(2, 15):
                for j in range(4):
                    self.cards.append(Card(i, j))
            shuffle(self.cards)
            #print(self.cards)
    
        def rm_card(self):
            if len(self.cards) == 0:
                return
            return self.cards.pop()
    
    # deck = Deck()
    # for card in deck.cards:
    #   print(card)
    
    class Player:
        def __init__(self, name):
            self.wins = 0
            self.card = None
            self.name = name
    
    # Gameクラスがスタート
    # 次にデッキクラス
    class Game:
        def __init__(self):
            # プレーヤー１名前と表示されてその後ろに名前を入力
            name1 = input('プレーヤー１名前')
            name2 = input('プレーヤー２名前')
            self.deck = Deck()
            self.p1 = Player(name1)
            self.p2 = Player(name2)
    
        def wins(self, winner):
            w = 'このラウンドは{}が勝ちました'
            w = w.format(winner)
            print(w)
    
        def draw(self, p1n, p1c, p2n, p2c):
            d = '{}は{}、{}は{}を引きました。'
            d = d.format(p1n, p1c, p2n, p2c)
            print(d)
    
        def play_game(self):
            cards = self.deck.cards
            print('戦争を始めます')
            # デッキが2枚以下になるまでループ
            while len(cards) >= 2:
                m = 'qで終了、それ以外のキーでplay:'
                response = input(m)
                if response == 'q':
                    break
                p1c = self.deck.rm_card()
                #print(self.deck.cards)
                p2c = self.deck.rm_card()
                #print(self.deck.cards)
                p1n = self.p1.name
                p2n = self.p2.name
                #自動で引かれたカードが何か表示
                self.draw(p1n, p1c, p2n, p2c)
                #どっちのカードが強いか比較して処理する。
                if p1c > p2c:
                    # playerクラスのwinに値を追加
                    self.p1.wins += 1
                    self.wins(self.p1.name)
                else:
                    self.p2.wins += 1
                    self.wins(self.p2.name)
    
            win = self.winner(self.p1, self.p2)
            print('ゲーム終了、{}の勝利です！'.format(win))
    
        def winner(self, p1, p2):
            if p1.wins > p2.wins:
                return p1.name
            if p1.wins < p2.wins:
                return p2.name
            return '引き分け!'
    
    game = Game()
    game.play_game()
    
[/code]

**追記**  
self.valueと書いたら出てきました。  
知りたいのはこういうことではなくこのvalueは一体どこから来たのかを表示できるようにする方法はないでしょうか？  
クラスはあっちに行ったりこっちに行ったりすごく読みずらいです。エンジニアの方々達は普段このようなコード一体どのように読んでいるのか気になります。上に行ったり下に行ったりちょっと読むだけで一苦労です。

self.values[self.value]の意味も気になります！これはリストなのでしょうか？

おそらくリストです。


CC BY-SA 4.0
2018-10-13T12:18:17.337
49249
2018-10-14T23:06:46.490
2018-10-14T23:06:46.490
22565
22565
question
python python3
Python selfの中に入っている引数を確認したい。


クラス`Card`には、`__str__`や`__repr__`が定義されていないため、`print(self)`とすると、デフォルトの表示で`3ofspades`等と表示されます。  
その表示をわかりやすく変更したいのであれば、`Card`に、`__str__`を定義することで変更することができます。

例えば、次のようにすると

[code]

    class Card(object):
        def __str__(self):
            return f'value: {self.value}, suit: {self.suit}'
    
[/code]

`print(self)`で次のように表示されます。また、クラス`Game`にある`print(d)`の方の表示も同じように変更されます。

[code]

    value: 7, suit: 0
    
[/code]

なお、実行中に変数の値を知りたいので、デバッガーを使う方が簡単です。下の図は、PyCharmの例ですが、ブレークポイントを設定してデバッグを実行すると簡単に変数の値がわかります。[![画像の説明をここに入力](https://i.stack.imgur.com/uic0o.png)](https://i.stack.imgur.com/uic0o.png)


CC BY-SA 4.0
2018-10-14T02:29:10.210
49256
2018-10-14T02:29:10.210
15171
49249
answer