“函数有一个__get __()方法,以便在作为属性访问时可以将它们转换为方法。”

时间:2017-07-05 20:07:15

标签: python python-3.x

根据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)函数调用。

感谢。

1 个答案:

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