术语:用户定义的函数对象属性?

时间:2016-07-25 16:46:54

标签: python oop methods language-lawyer terminology

根据Python 2.7.12文档,User-defined methods

  

获取属性时可能会创建用户定义的方法对象   一个类(可能通过该类的实例),如果该属性   是用户定义的函数对象,一种未绑定的用户定义方法   对象或类方法对象。当属性是   用户定义的方法对象,只创建一个新的方法对象   从中检索它的类与之相同或派生   class,类存储在原始方法对象中;除此以外,   原始方法对象按原样使用。

我知道Python中的所有内容都是对象,因此“用户定义的方法”必须与“用户定义的方法对象”相同。但是,我无法理解为什么存在“用户定义的函数对象属性”。比如说,在以下代码中:

class Foo(object):
    def meth(self):
       pass

meth是在类体内定义的函数,因此是method。那么为什么我们可以拥有“用户定义的函数对象属性”?是不是在类体内定义了所有属性?

Bouns问题提供一些示例,说明如何通过获取类的属性来创建用户定义的方法对象。在类定义中不是定义的对象吗? (我知道方法可以分配给类实例,但那是猴子修补。)

我正在寻求帮助,因为这部分文档对我来说真的很困惑,一个只懂C的程序员,因为Python是一种支持函数式编程和面向对象程序员的神奇语言,我没有'还掌握了。我做了很多搜索,但仍然无法弄清楚。

1 个答案:

答案 0 :(得分:3)

当你这样做时

class Foo(object):
    def meth(self):
       pass

您正在使用方法Foo定义课程meth。但是,执行此类定义时,不会创建任何方法对象来表示该方法。 def语句创建一个普通的函数对象。

如果你那么做

Foo.meth

Foo().meth

属性查找查找函数对象,但函数对象不用作属性的值。相反,使用descriptor protocol,Python调用函数对象的__get__方法来构造方法对象,并将该方法对象用作该查找的属性值。对于Foo.meth,方法对象是一个未绑定的方法对象,其行为大致类似于您定义的函数,但具有一些额外的类型检查。对于Foo().meth,方法对象是一个绑定方法对象,它已经知道self是什么。

这就是Foo().meth()没有抱怨缺少self参数的原因;将0个参数传递给方法对象,然后将self添加到(空)参数列表中,并将参数传递给基础函数对象。如果Foo().meth直接评估meth函数,则必须明确传递self

在Python 3中,Foo.meth不创建方法对象;函数的__get__仍然被调用,但它直接返回函数,因为它们认为未绑定的方法对象没用。但是,Foo().meth仍然会创建一个绑定的方法对象。