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

fun*_*hun 59 python

对于错误:

TypeError: takes exactly 1 argument (2 given)
Run Code Online (Sandbox Code Playgroud)

使用以下类方法:

def extractAll(tag):
   ...
Run Code Online (Sandbox Code Playgroud)

并称之为:

e.extractAll("th")
Run Code Online (Sandbox Code Playgroud)

当我给它1个参数时,错误似乎很奇怪,该方法应该只采用1个参数,但它说我不给它1个参数....我知道问题可以通过添加self到方法原型中来解决但我想知道错误背后的原因.

我得到它是因为通过e.extractAll("th")调用它的行为也self作为参数传递?如果是这样,通过删除self调用,我会使它成为某种类可以调用的类方法Extractor.extractAll("th")吗?

Sve*_*ach 80

电话

e.extractAll("th")
Run Code Online (Sandbox Code Playgroud)

对于常规方法extractAll()确实相当于

Extractor.extractAll(e, "th")
Run Code Online (Sandbox Code Playgroud)

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

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

@staticmethod
def extractAll(tag):
    ...
Run Code Online (Sandbox Code Playgroud)

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


小智 28

如果非静态方法是类的成员,则必须像下面那样定义它:

def Method(self, atributes..)
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*man 9

我得到它是因为通过e.extractAll("th")调用它的行为也作为一个参数传入自我?

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

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

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

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