有趣';只接受1个参数(给定2个)';Python错误

有趣';只接受1个参数(给定2个)';Python错误,python,Python,对于错误: TypeError: takes exactly 1 argument (2 given) 使用以下类方法: def extractAll(tag): ... 并称之为: e.extractAll("th") 当我给它一个参数时,这个错误看起来很奇怪,这个方法应该只取一个参数,但它说我没有给它一个参数……我知道这个问题可以通过在方法原型中添加self来解决,但我想知道错误背后的原因 我得到它是因为通过e.extractAll(“th”)调用它的行为也作为参数传入self?

对于错误:

TypeError: takes exactly 1 argument (2 given)
使用以下类方法:

def extractAll(tag):
   ...
并称之为:

e.extractAll("th")
当我给它一个参数时,这个错误看起来很奇怪,这个方法应该只取一个参数,但它说我没有给它一个参数……我知道这个问题可以通过在方法原型中添加
self
来解决,但我想知道错误背后的原因

我得到它是因为通过
e.
extractAll(“th”)调用它的行为也作为参数传入
self
?如果是这样的话,通过删除调用中的
self
,我会使它成为某种类方法,可以像
提取器.extractAll(“th”)
调用那样调用吗

e.extractAll("th")
对于常规方法,
extractAll()
确实相当于

Extractor.extractAll(e, "th")
这两个调用在所有方面都是一样的,包括您收到的错误消息

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

@staticmethod
def extractAll(tag):
    ...

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

是的,当您调用
e.extractAll(foo)
时,Python会将其转换为
extractAll(e,foo)

方法的特殊之处在于 对象作为第一个对象传递 函数的参数。在我们 例如,调用x.f()正好是 相当于MyClass.f(x)。在里面 常规,使用列表调用方法 n个参数的个数等于 调用相应的函数 使用创建的参数列表 通过插入方法的对象 在第一次辩论之前

重点补充

我得到它是因为通过e.extractAll(“th”)调用它的行为也作为一个论点传入self吗

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

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

不完全是。classmethod需要
@classmethod
装饰器,它接受类作为第一个参数(通常被引用为
cls
)。唯一一种完全没有自动参数的方法称为staticmethod,它同样需要一个decorator(毫不奇怪,它是
@staticmethod
)。当一个操作需要引用类本身时,可以使用classmethod:可能是实例化类的对象;当代码逻辑上属于类,但不需要访问类或实例时,使用staticmethod


但是可以,staticmethods和classmethods都可以通过引用您描述的类名来调用:
Extractor.extractAll(“th”)
如果非静态方法是类的成员,您必须这样定义它:

def Method(self, atributes..)
因此,我假设您的“e”是某个类的实例,该类的实现方法尝试执行,并且参数太多。

尝试使用:

def extractAll(self,tag):
注意self

摘要(一些关于如何在python类中定义方法的示例)

范例

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")`

这两种代码在常见的、编写良好的python代码中也相对少见。如果您认为需要立即使用它们,我建议您重新考虑是否需要在类中使用它们。也许你正在尝试用python编写Java。我有点喜欢使用classmethod作为工厂方法:它可以明确创建什么类型的对象。如果我需要正确访问类的字段,在类中使用此方法是合理的?…@funk-sun:是的,但是你需要一个
classsmethod
,不是
静态方法
。通常,我只会对这种方法使用普通方法。@user2533809:通常,
classmethod
的第一个参数被称为
cls
,因为它是类本身,而不是它的实例。感谢Sven Marnach提供的信息,所以:
def extractAll(self,tag)
被称为:
my_obj.extractAll(tag)
|
@classmethod
def extractAll(cls,tag)
被称为:
Extract.extractAll(tag)
只需在函数参数前面添加self:def extractAll(self,tag)
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")`