缺少一个必需的位置参数?知道为什么吗?

时间:2019-06-07 20:19:14

标签: python arguments typeerror

我正在尝试以下问题:

  

实现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”。

1 个答案:

答案 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):
    ...

前者偶尔有用。后者仅在处理多态性和继承时才真正相关。