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

Python 缺少一个必需的位置参数?知道为什么吗?,python,arguments,typeerror,Python,Arguments,Typeerror,我正在尝试以下问题: 实现一个CardHand类,该类支持一个人安排一组 他或她手中的牌。模拟器应表示序列 使用单个位置列表ADT的卡片,以便相同的卡片 这套衣服放在一起。通过四种方式实施这一战略 “手指”伸进手里,一根手指代表一套红桃,一根棍棒, 黑桃和钻石,这样就可以在人的手上增加一张新卡 或者打一张正确的牌可以在固定的时间内完成。 该类应支持以下方法: 添加牌(r,s):在手上添加一张等级为r且适合s的新牌 游戏(s):从玩家手上移除并归还一张套装牌;如果没有套装卡s,则移除并返回任意

我正在尝试以下问题:

实现一个CardHand类,该类支持一个人安排一组 他或她手中的牌。模拟器应表示序列 使用单个位置列表ADT的卡片,以便相同的卡片 这套衣服放在一起。通过四种方式实施这一战略 “手指”伸进手里,一根手指代表一套红桃,一根棍棒, 黑桃和钻石,这样就可以在人的手上增加一张新卡 或者打一张正确的牌可以在固定的时间内完成。 该类应支持以下方法:

  • 添加牌(r,s):在手上添加一张等级为r且适合s的新牌
  • 游戏(s):从玩家手上移除并归还一张套装牌;如果没有套装卡s,则移除并返回任意 手上的卡片
  • iter():遍历当前手中的所有卡片
  • 全部套牌:迭代当前手上的所有套牌
我已经得到了位置列表及其基础的代码,但是它有太多的行要读,所以我不会发布它。我在其他任务中使用了相同的位置列表,并且一直有效。只需询问您是否能理解为什么这段代码会抛出此错误:

缺少一个必需的位置参数“r”

您正在将实例方法作为静态方法调用。而不是

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自然会感到困惑,并说“我应该看到的第三个参数在哪里?”,这导致了您的错误


顺便说一句,如果您确实想创建一个静态方法—一个可以在类本身上调用的方法,而不是在类的实例上调用的方法(因此,没有
self
参数),您可以使用decorator来实现:

@staticmethod
def some_method(a, b):
    ...
或者,也可以使用类方法,它类似于实例方法,但将类的类型作为参数,而不是类的实例:


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

类中是否有类?您调用的是类,而不是实例…CardHand。添加卡片('s','4')是的,我被告知无论如何都要感谢您。我想这是常识,但让我非常头痛
@staticmethod
def some_method(a, b):
    ...
@classmethod
def some_method(cls, a, b):
    ...