Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python基类在子类中调用_init__Python_Oop_Inheritance - Fatal编程技术网

Python基类在子类中调用_init_

Python基类在子类中调用_init_,python,oop,inheritance,Python,Oop,Inheritance,我正在尝试用python制作一个战争卡片游戏,它改进了一本叫做自学程序员的书中的一个例子。在我的版本中,我想遵循自行车卡网站上的规则。为了回到我的问题,我编写了两个类Stack和一个Deck类继承Stack 牌组init使用一副牌组中的所有52张牌填充基类中的空列表变量牌,并将其洗牌。我在IDLE中测试这些类,发现当我创建Stack的对象时,似乎调用了来自Deck的init,并在没有创建子类对象时填充父类中的card变量。这是怎么回事?据我所知,父类看不到子类 from random impor

我正在尝试用python制作一个战争卡片游戏,它改进了一本叫做自学程序员的书中的一个例子。在我的版本中,我想遵循自行车卡网站上的规则。为了回到我的问题,我编写了两个类Stack和一个Deck类继承Stack

牌组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)
来自随机导入洗牌
班级卡:
套装=[“梅花”、“黑桃”、“钻石”、“红心”]
值=[None,None,“2”,“3”,“4”,“5”,“6”,
“7”、“8”、“9”、“10”、“杰克”、“女王”、“国王”、“王牌”]
定义初始化(self,v,s):
自我价值=自我价值[v]
self.suit=self.suits[s]
定义报告(自我):
返回self.value+“of”\
+西服
定义(自我,指挥与控制):
如果self.valuec2.value:
返回真值
如果self.value==c2.value:
如果自攻>c2自攻:
返回错误
返回错误
定义(自我,c2):
如果self.value==c2.value:
返回真值
其他:
返回错误
类堆栈:
卡片=[]
def添加(自身、卡):
self.cards.append(卡片)
def ADDTOBTOM(自身、卡):
self.cards.insert(0,卡片)
def removeCard(自):
return self.cards.pop()
定义报告(自我):
idx=len(自显卡)-1
返回自助卡[idx]
甲板(烟囱)等级:
定义初始化(自):
对于范围(2,15)内的i:
对于范围(0,4)内的j:
self.cards.append(卡片(i,j))
洗牌(自我牌)

这是因为类属性中有
卡。如果先创建
牌组
,然后创建
堆栈
,则牌组的创建将填充每个人共享的
Stack.cards
属性

您需要将
卡片
作为实例属性:

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

    . . .

我运行了你的代码,无法重现你的问题。你能分享你在IDLE中输入的内容吗?你需要展示你是如何使用这些类的。-无法复制。