对于错误:
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'是某个类的实例,其中实现的方法试图执行并且有太多的参数.
我得到它是因为通过e.extractAll("th")调用它的行为也作为一个参数传入自我?
是的,就是这样.如果您愿意,第一个参数是e您要调用它的对象名称.
如果是这样,通过删除调用中的self,我会使它成为某种可以像Extractor.extractAll("th")一样调用的类方法吗?
不完全的.classmethod需要@classmethod装饰器,并接受该类作为第一个参数(通常称为cls).唯一一种没有自动参数的方法被称为静态方法,而且还需要一个装饰器(不出所料,它是@staticmethod).当一个类方法需要引用类本身时,可以使用类方法:也许实例化类的对象; 当代码在逻辑上属于类时,使用static方法,但不需要访问类或实例.
但是,可以通过引用您描述的类名来调用staticmethods和classmethods : Extractor.extractAll("th").