我在一个类中创建了一个方法。当我第一次调用该方法时,它似乎有效并提供了所需的输出。当我再次运行它时,我得到一个“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'
请注意导致所述问题的方法在堆栈类中。
我一直在玩弄它,并将代码更改为您现在看到的样子,但老实说,我不太确定该怎么做。我知道我的手是一张清单,它应该是。似乎类型没有改变,并且方法在之前的列表类型上起作用。
也许一双新鲜的眼睛会有所帮助。
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
属性。