类型错误:equals() 接受 1 个位置参数,但给出了 2 个

Posted

技术标签:

【中文标题】类型错误:equals() 接受 1 个位置参数,但给出了 2 个【英文标题】:TypeError: equals() takes 1 positional argument but 2 were given 【发布时间】:2020-03-08 05:16:07 【问题描述】:

在我的程序中,我基本上想返回一个测试两个学生之间是否相等的方法的结果(即,如果两个学生上的课程数量相等)

我创建了一个名为 Student 的类。然后我创建了两个函数并定义了它们的属性。我实际上是在尝试比较学生类中的两个对象,并且需要一种方法来检查两者之间的相等性。

class Student:


    def __init__(self, name, age, classesTaken):
        self.name = name
        self.age = age
        self.classesTaken = classesTaken

    def equals (student):
        is_equals = student.name == self.name and student.age == self.age and 
        student.classesTaken == self.classesTaken
        return is_equals


mike = Student("Mike", 21, 25)
john = Student("John", 19, 22)

#problem starts here
print (mike.equals(john))

我不断收到错误:

输入 Traceback(最近一次调用最后一次): 文件“main.py”,第 18 行,在

print (mike.equals(john)) TypeError: equals() 接受 1 个位置参数,但给出了 2 个

【问题讨论】:

一个调用方法被隐式地使用instance 调用。使用def equals (self, student) 而不是def equals (student) 您错过了添加强制性self 参数。 【参考方案1】:

self 添加到您的equals function 参数中

def equals (self,student):

【讨论】:

【参考方案2】:

在python中,实例方法将self作为第一个参数来引用它们被调用的实例:

def equals(self, student):
    # ...

话虽如此,您可能会考虑覆盖dunder method __eq__

def __eq__(self, other):
    # ...

这将允许您通过 == 更 Python 地测试相等性:

mike == john

【讨论】:

【参考方案3】:

当你在这个类的一个实例中调用一个类方法时,python 会隐式传递一个对该实例的引用作为 第一个方法参数,这就是为什么它告诉你“equals() 需要 1 个位置论据,但给出了 2 个”

示例:

class A:
  def method(argument):
    print(argument)

B = A()
B.method(new_argument) # it will raise the the same TypeError

# Because python will convert the call of class method like so:
A.method(B, argument)

# So the solution is to call it with the keyword 'self':
B.argument(self, new_argument)

【讨论】:

以上是关于类型错误:equals() 接受 1 个位置参数,但给出了 2 个的主要内容,如果未能解决你的问题,请参考以下文章

TypeError: login() 接受 1 个位置参数,但给出了 2 个

简单的留言簿 django:__init__() 接受 1 个位置参数,但给出了 2 个

TypeError: worker() 接受 0 个位置参数,但给出了 1 个

__ init __()接受1个位置参数,但在对标记添加Latex支持时给出了2个位置参数

Python:函数接受 1 个位置参数,但给出了 2 个,如何?

TypeError: __init__() 接受 1 个位置参数,但给出了 2 个