根据Python的Descriptor 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)
函数调用。
感谢。
答案 0 :(得分:4)
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
必须是函数或方法 - 它可能是其他一些可调用对象---因此差异这两者之间并不是那么重要。相反,您只想考虑对象定义的可调用行为。最终所有这些调用都转变为函数调用,并且"方法"它只是一种特殊类型的公共可调用对象的名称,其可调用行为是在调用基础函数之前插入self
参数,如上所述。