有趣';只接受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")`