有趣的“只有1个参数(2给出)”Python错误

对于错误:

TypeError: takes exactly 1 argument (2 given) 

使用以下类的方法:

 def extractAll(tag): ... 

并称之为:

 e.extractAll("th") 

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

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

电话

 e.extractAll("th") 

对于一个常规方法extractAll()的确是等价的

 Extractor.extractAll(e, "th") 

这两个调用在所有方面都是一样的,包括你得到的错误信息。

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

 @staticmethod def extractAll(tag): ... 

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

如果一个非静态的方法是一个类的成员,你必须像这样定义它:

 def Method(self, atributes..) 

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

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

是的,就是这样。 如果你喜欢,第一个参数是你调用它的对象名称。

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

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

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

是的,当你调用e.extractAll(foo) ,Python会将其转化为extractAll(e, foo)

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

关于方法的特殊之处在于该对象是作为函数的第一个parameter passing的。 在我们的例子中,调用xf()完全等价于MyClass.f(x)。 一般情况下,调用带有n个参数列表的方法相当于使用通过在第一个参数之前插入方法对象创build的参数列表来调用相应的函数

重点补充。

总结(如何在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 # (ie 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")` 

尝试使用:

 def extractAll(self,tag): 

注意自我