根据 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
参数,如上所述。