对于错误:
TypeError: takes exactly 1 argument (2 given)
使用以下类方法:
def extractAll(tag):
...
并称之为:
e.extractAll("th")
当我给它1个参数时,错误似乎很奇怪,该方法应该只采用1个参数,但是它说我不给它1个参数....我知道问题可以通过添加{ {1}}进入方法原型,但我想知道错误背后的原因。
我得到它是因为通过self
extractAll(“th”)调用它的行为也作为参数传递给e.
吗?如果是这样,通过删除调用中的self
,我是否可以将其称为类似self
的类方法?
答案 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):
关注自我