类方法在列表上工作一次,然后在第二轮抛出属性错误

问题描述 投票:0回答:1

我在一个类中创建了一个方法。当我第一次调用该方法时,它似乎有效并提供了所需的输出。当我再次运行它时,我得到一个“AttributeError:‘list’对象没有属性‘trek’”。这是代码:

#this creates a playing card with a suit and value
class Kaart:
    def __init__(self, kleur, waarde):
        self.kleur = kleur
        self.waarde = waarde
        self.value = waarde
        if waarde == "Boer":
            self.value = 11
        if waarde == "Vrouw":
            self.value = 12
        if waarde == "Heer":
            self.value = 13
        if waarde == "Aas":
            self.value = 14
    def __repr__(self):
        return self.kleur, self.waarde
    def __repr__(self):
        return f"{self.kleur} {self.waarde}"
    def __eq__(self, other):
        return self.value == other.value
    def __gt__(self, other):
        return self.value > other.value
    def __lt__(self, other):
        return self.value < other.value

k1 = Kaart("Ruiten", 2)
k2 = Kaart("Harten", "Heer")
k3 = Kaart("Klaveren", 7)

k4 = Kaart("Harten", 4)
k5 = Kaart("Harten", 3)
k6 = Kaart("Schoppen", 8)
#This creates a couple of stacks of three cards.
class Trekstapel:
    def __init__(self, kaarten):
        self.stack = kaarten
    def __repr__(self):
        return self.stack
    def __str__(self):
        return str(self.stack)
    def __len__(self):
        return len(self.stack)
    def __getitem__(self, n):
        return self.stack[n]
    def __add__(self, other):
        return list(self.stack) + list(other)
    def __radd__ (self, other):
        return list(other) + list(self.stack)
    def voegtoe(self, kaart):
        self.stack.insert(0, kaart)
        return self.stack
    def trek(self):
        tempList = self.stack
        card = tempList[-1]
        self.stack.pop()
        return card
    

t1 = Trekstapel([k1, k2, k3])
t2 = Trekstapel([k4, k5, k6])
#This is the "game" whereby each player compares a card and the player with the higher card gets to keep both cards.
class Oorlogje:
    def __init__(self, player_1, player_2):
        self.deck = player_1
        self.opponent = player_2
    def __repr__(self):
        return f"{self.deck} vs {self.opponent}"
    def turn(self):
        hand_1 = self.deck.trek()
        hand_2 = self.opponent.trek()
        if hand_1 > hand_2: 
            newList = [hand_2, hand_1]
            self.deck = newList + self.deck 
        if hand_1 < hand_2:
            newList = [hand_1, hand_2]
            self.opponent = newList + self.opponent
        return f"{self.deck} vs {self.opponent}"
    def win(self):
        if len(self.deck) == 0:            
            print("Player 2 won!")
            return True
        if len(self.opponent) == 0:            
            print("Player 1 won!")
            return True
        return False


game = Oorlogje(t1, t2)
loop = 0

print(game)

while game.win() == False:
    print(game.turn())
    loop += 1

print("Game ended in", loop, "turns.")

最后,我得到的输出:

[Ruiten 2, Harten Heer, Klaveren 7] vs [Harten 4, Harten 3, Schoppen 8]
[Ruiten 2, Harten Heer] vs [Klaveren 7, Schoppen 8, Harten 4, Harten 3]
Traceback (most recent call last):
  File "D:/Bestanden/Cursussen/corepy/speelkaarten.py", line 141, in <module>
    print(game.turn())
  File "D:/Bestanden/Cursussen/corepy/speelkaarten.py", line 117, in turn
    hand_2 = self.opponent.trek()
AttributeError: 'list' object has no attribute 'trek'

请注意导致所述问题的方法在堆栈类中。

我一直在玩弄它,并将代码更改为您现在看到的样子,但老实说,我不太确定该怎么做。我知道我的手是一张清单,它应该是。似乎类型没有改变,并且方法在之前的列表类型上起作用。

也许一双新鲜的眼睛会有所帮助。

python attributeerror
1个回答
0
投票
newList = [hand_1, hand_2]
self.opponent = newList + self.opponent

导致您看到的错误

self.opponent
不再是
Trekstapel
因为它被重新分配给了
list
.

所以稍后:

hand_2 = self.opponent.trek()

Python告诉你:

AttributeError: 'list' object has no attribute 'trek'

list
没有
trek
属性。

© www.soinside.com 2019 - 2024. All rights reserved.