有趣的'需要1个参数(2个给定)'Python错误

时间:2011-02-05 20:54:19

标签: python

对于错误:

TypeError: takes exactly 1 argument (2 given)

使用以下类方法:

def extractAll(tag):
   ...

并称之为:

e.extractAll("th")

当我给它1个参数时,错误似乎很奇怪,该方法应该只采用1个参数,但是它说我不给它1个参数....我知道问题可以通过添加{ {1}}进入方法原型,但我想知道错误背后的原因。

我得到它是因为通过self extractAll(“th”)调用它的行为也作为参数传递给e.吗?如果是这样,通过删除调用中的self,我是否可以将其称为类似self的类方法?

6 个答案:

答案 0 :(得分:78)

电话

e.extractAll("th")

对于常规方法extractAll()确实等同于

Extractor.extractAll(e, "th")

这两个调用在所有方面都被视为相同,包括您收到的错误消息。

如果您不需要将实例传递给方法,可以使用staticmethod

@staticmethod
def extractAll(tag):
    ...

可以称为e.extractAll("th")。但我想知道如果你不需要访问任何实例,为什么这是一个类的方法。

答案 1 :(得分:28)

如果非静态方法是类的成员,则必须将其定义为:

def Method(self, atributes..)

所以,我想你的'e'是某个类的实例,它有一个实现的方法,试图执行并且有太多的参数。

答案 2 :(得分:9)

  

我得到它是因为通过e.extractAll(“th”)调用它的行为也作为参数传递给自己吗?

是的,就是这样。如果您愿意,第一个参数是您正在调用它的对象名称e

  

如果是这样,通过删除调用中的self,我会使它成为某种可以像Extractor.extractAll(“th”)一样调用的类方法吗?

不完全。 classmethod需要@classmethod装饰器,并接受作为第一个参数(通常称为cls)。唯一一种没有自动参数的方法被称为静态方法,而且还需要一个装饰器(不出所料,它是@staticmethod)。当一个类方法需要引用类本身时,可以使用类方法:也许实例化类的对象;当代码在逻辑上属于类时,使用static方法,但不需要访问类或实例。

但是,可以通过引用您描述的类名来调用staticmethods和classmethods:Extractor.extractAll("th")

答案 3 :(得分:4)

是的,当您调用e.extractAll(foo)时,Python将其导入extractAll(e, foo)

来自http://docs.python.org/tutorial/classes.html

  

方法的特殊之处在于   该对象作为第一个传递   函数的参数。在我们的   例如,调用x.f()是完全正确的   相当于MyClass.f(x)。在   一般来说,用列表调用方法   n个参数的等价于   调用相应的函数   使用创建的参数列表   通过插入方法的对象   在第一个论点之前

强调补充。

答案 4 :(得分:4)

总结(如何在python中定义类中的方法的一些示例)

#!/usr/bin/env python   # (if running from bash)

class Class1(object):

    def A(self, arg1):
        print arg1
        # this method requires an instance of Class1   
        # can access self.variable_name, and other methods in Class1

    @classmethod
    def B(cls, arg1):
        cls.C(arg1)
        # can access methods B and C in Class1 

    @staticmethod
    def C(arg1):
        print arg1
        # can access methods B and C in Class1 
        # (i.e. via Class1.B(...) and Class1.C(...))

示例

my_obj=Class1()

my_obj.A("1")
# Class1.A("2") # TypeError: method A() must be called with Class1 instance

my_obj.B("3")
Class1.B("4")
my_obj.C("5")
Class1.C("6")`

答案 5 :(得分:1)

尝试使用:

def extractAll(self,tag):

关注自我