根据Python 2.7.12文档,User-defined methods:
获取属性时可能会创建用户定义的方法对象 一个类(可能通过该类的实例),如果该属性 是用户定义的函数对象,一种未绑定的用户定义方法 对象或类方法对象。当属性是 用户定义的方法对象,只创建一个新的方法对象 从中检索它的类与之相同或派生 class,类存储在原始方法对象中;除此以外, 原始方法对象按原样使用。
我知道Python中的所有内容都是对象,因此“用户定义的方法”必须与“用户定义的方法对象”相同。但是,我无法理解为什么存在“用户定义的函数对象属性”。比如说,在以下代码中:
class Foo(object):
def meth(self):
pass
meth
是在类体内定义的函数,因此是method。那么为什么我们可以拥有“用户定义的函数对象属性”?是不是在类体内定义了所有属性?
Bouns问题提供一些示例,说明如何通过获取类的属性来创建用户定义的方法对象。在类定义中不是定义的对象吗? (我知道方法可以分配给类实例,但那是猴子修补。)
我正在寻求帮助,因为这部分文档对我来说真的很困惑,一个只懂C的程序员,因为Python是一种支持函数式编程和面向对象程序员的神奇语言,我没有'还掌握了。我做了很多搜索,但仍然无法弄清楚。
答案 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
仍然会创建一个绑定的方法对象。