python - Python 基类在子类中调用 __init__
问题描述
我正在尝试用 python 制作一个战争纸牌游戏,以改进一本名为 Self Taught Programmer 的书中的示例。在我的版本中,我想遵循自行车卡网站上的规则。为了回到我的问题,我编写了两个类 Stack 和一个继承 Stack 的 Deck 类。
Decks init用一副牌中的所有 52 张牌填充基类中的空列表变量卡,并将它们洗牌。我去测试 IDLE 中的类,并发现当我创建 Stack 对象时,似乎来自 Deck 的init被调用并在没有创建子类对象时填充父类中的 card 变量。这怎么样?据我了解,父类看不到子类。
from random import shuffle
class Card:
suits = ["Clubs", "Spades", "Diamonds", "Hearts"]
values = [None, None, "2", "3", "4", "5", "6",
"7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
def __init__(self, v, s):
self.value = self.values[v]
self.suit = self.suits[s]
def __repr__(self):
return self.value + " of " \
+ self.suit
def __lt__(self, c2):
if self.value < c2.value:
return True
if self.value == c2.value:
if self.suit < c2.suit:
return False
return False
def __gt__(self, c2):
if self.value > c2.value:
return True
if self.value == c2.value:
if self.suit > c2.suit:
return False
return False
def __eq__(self, c2):
if self.value == c2.value:
return True
else:
return False
class Stack:
cards = []
def add(self, card):
self.cards.append(card)
def addToBottom(self, card):
self.cards.insert(0, card)
def removeCard(self):
return self.cards.pop()
def __repr__(self):
idx = len(self.cards) - 1
return self.cards[idx]
class Deck (Stack):
def __init__(self):
for i in range(2, 15):
for j in range(0, 4):
self.cards.append(Card(i, j))
shuffle(self.cards)
解决方案
这是因为你有cards
一个类属性。如果您先创建一个Deck
,然后创建一个,则Stack
牌组的创建会填充Stack.cards
每个人都共享的属性。
您需要创建cards
一个实例属性:
class Stack:
def __init__(self):
self.cards = []
. . .