"functions have a __get__() method so that they can be converted to a method when accessed as attri



根据 Python 的描述符 HowTo Guide

函数具有__get__()方法,因此作为属性访问时可以将其转换为方法

非数据描述符将obj.f(*args)调用转换为f(obj,*args)。呼唤klass.f(*args)变得f(*args)

意思是

  • obj.f(*args)转换为f(obj,*args)klass.f(*args)转换为f(*args)

  • obj.f(*args)klass.f(*args)是函数调用,f(obj,*args)f(*args)方法调用?我觉得相反的情况是正确的:obj.f(*args)klass.f(*args)是方法调用,f(obj,*args)f(*args)函数调用。

谢谢。

obj.f(*args)转换为

f(obj,*args)klass.f(*args)转换为f(*args)?

是的。 但是,在Python 3中,klass.f(*args)没有"转换",因为未绑定的方法不再存在,所以klass.f只是普通的f

obj.f(*args)klass.f(*args)是函数调用,f(obj,*args)f(*args)方法调用?

不。f是一个函数。 当该函数作为实例的属性访问时,如在obj.f中,结果是一个方法对象。 因此obj.f(*args)是对方法对象的调用。 如上所述,方法对象将其转换为函数调用f(obj, *args)。 此外,如上所述,Python 3 中的klass.f只是一个普通函数,因此klass.f(*args)f(*args)都是等效的。

我发现最好不要太纠结于Python中"方法"和"函数"之间的区别。 在 Python 中,与其他一些语言不同,你可以使多种对象可调用(通过定义__call__方法)。 正因为如此,当你看到some_obj()时,这并不意味着some_obj必须是函数或方法---它可以是其他可调用对象---,因此两者之间的区别并不是那么重要。 相反,您只想考虑对象定义的可调用行为。 最终,所有这些调用都变成了函数调用,而"method"只是一种特定类型的公共可调用对象的名称,其可调用行为是在调用底层函数之前插入self参数,如上所述。

相关内容

最新更新