首页 > 解决方案 > 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)

标签: pythonoopinheritance

解决方案


这是因为你有cards一个类属性。如果您先创建一个Deck然后创建一个,则Stack牌组的创建会填充Stack.cards每个人都共享的属性。

您需要创建cards一个实例属性:

class Stack:
    def __init__(self):
        self.cards = []

    . . .

推荐阅读