我正在尝试以下问题:
实现CardHand类,该类支持一个人安排一组 卡在他或她的手中。模拟器应代表顺序 使用单个位置列表ADT的卡片,因此相同的卡片 西装放在一起。通过以下四种方式实施该策略 “手指”伸入手中,每把红心,棍棒各一套, 黑桃和钻石,以便将新卡片添加到该人的手中 或在正确的时间内用正确的牌打出。 该类应支持以下方法:
- 添加卡片(r,s):向手添加等级r和适合s的新卡片。
- 玩法:从玩家手上移出西服卡片并返还;如果没有西装的卡片,则移除并返回任意 卡从手中。
- iter():遍历手中的所有卡。
- 所有西装:遍历当前手中的所有西装卡。
class CardHand:
"""Class representing a hand of cards"""
class _Card:
"""Class representing a single card"""
suits = ['Hearts', 'Clubs', 'Diamonds', 'Spades']
ranks= ['Ace','2','3','4','5','6','7','8','9','10','11','Jack', 'Queen', 'King']
def __init__(self,suit,rank):
self._suit = suit
self._rank = rank
def __str__(self):
return self._rank + ' ' + self._suit
def __init__(self):
self._hand = PositionalList()
self._size = 0
def _validate(self,s,r):
card = self._Card(s,r)
if not card._suit in suits:
raise ValueError("Such card doesn't exist")
if not card._rank in ranks:
raise ValueError("Invalid card value")
return card
def add_card(self,s,r):
return self._hand.add_first(self._Card(s,r))
print(CardHand.add_card('s', '4'))
我已经获得了位置列表及其基础的代码,但是要阅读的行太多,所以我不会发布它。我一直在使用相同的位置列表执行其他任务,并且一直在工作。只问您是否可以看到为什么这段代码会引发此错误:
“缺少一个必需的位置参数“ r”。
答案 0 :(得分:1)
您将实例方法称为静态方法。代替
CardHand.add_card('s', '4')
你应该做
ch = CardHand()
ch.add_card('s', '4')
这是为什么:
中的参数self
def add_card(self, s, r):
指的是调用add_card()
的实例-在上面的后一个示例中,ch
被作为self
传递给方法,这是不可见的。实际上,以下两个是等效的:
ch.add_card('s', '4')
CardHand.add_card(ch, 's', '4')
因此,当您执行CardHand('s', '4')
时,并不是在实例上调用它,而是在类本身上调用它。因此,自然地,python会感到困惑,并说“我应该看到的第三个参数在哪里?”,这会导致您的错误。
顺便说一句,如果您想做一个静态方法-可以在类本身而不是类的实例上调用的静态方法(因此,没有{{1} }参数),您可以使用装饰器来实现:
self
或者,也可以有一个 class方法,它类似于实例方法,但是将类的类型作为参数而不是实例类:
@staticmethod
def some_method(a, b):
...
前者偶尔有用。后者仅在处理多态性和继承时才真正相关。