特殊メソッド __gt__ の引数が self の他に一つしか無い理由
Pythonで勉強をかねて戦争ゲームを制作しているのですが、いまいち読めずに苦戦しています。
def __gt__(self, c2)
このコードがde f__gt__(self, c1, c2)
になってないのが気になります。
if p1c > p2c:
が実行される時にdef __gt__(self, c2)
のメソッドが実行されるのかなとは思いますが(もしかしたら違うのかも)なぜc1
は書かれていないのでしょうか?
from random import shuffle
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 __It__(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):
# プレーヤー1名前と表示されてその後ろに名前を入力
name1 = input('プレーヤー1名前')
name2 = input('プレーヤー2名前')
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()
追記
selfがいまいちわかっていないと思うのですが、以下のサイトで
https://www.sejuku.net/blog/64106
このような記載がありました。selfはインスタンス自身を示すものなので、呼び出す側は引数として値を入れない事です。 これは__init__の特殊メソッドを使う時、限定ですか?
追記2
なんども追加の質問申し訳ありません。
Cardクラスは自分自身が何なのか分からない状態なので、第一引数(self)も渡す必要があります。
このように記載されていたのですが、これはclass Card(object):
のように書いたから第一引数が必要という意味でしょうか?
多分こういうこと
第一引数にはclassの名前が入る。
class Boku(object):
# これはクラス変数
subject = "ぼくは"
name = "ドラえもん"
def __init__(self, nickname):
self.nickname = nickname # これはインスタンス変数
print(self.__class__.__name__)
wataru = Boku('wakasu')
実行結果:Boku
インスタンス(クラスからできたもの)のメソッドを呼び出すと、第一引数は自動的にそのインスタンス自身になる。
インスタンスの意味をしっかり把握できてなくて分からないのですが(サイトで確認はしました。)
c2はその後にインスタンスになるのでしょうか?