Python 术语:用户定义的功能对象属性?
根据Python 2.7.12文档: 获取属性时,可以创建用户定义的方法对象 类的实例(可能通过该类的实例),如果该属性 是一个用户定义的函数对象,一个未绑定的用户定义方法 对象或类方法对象。当属性为 用户定义的方法对象,仅当 从中检索的类与或派生的类相同 类,存储在原始方法对象中的类;否则,, 原始方法对象按原样使用 我知道Python中的一切都是对象,所以“用户定义方法”必须与“用户定义方法对象”相同。但是,我不明白为什么会有“用户定义的函数对象属性”。例如,在以下代码中:Python 术语:用户定义的功能对象属性?,python,oop,methods,language-lawyer,terminology,Python,Oop,Methods,Language Lawyer,Terminology,根据Python 2.7.12文档: 获取属性时,可以创建用户定义的方法对象 类的实例(可能通过该类的实例),如果该属性 是一个用户定义的函数对象,一个未绑定的用户定义方法 对象或类方法对象。当属性为 用户定义的方法对象,仅当 从中检索的类与或派生的类相同 类,存储在原始方法对象中的类;否则,, 原始方法对象按原样使用 我知道Python中的一切都是对象,所以“用户定义方法”必须与“用户定义方法对象”相同。但是,我不明白为什么会有“用户定义的函数对象属性”。例如,在以下代码中: class Fo
class Foo(object):
def meth(self):
pass
meth
是在类主体内部定义的函数,因此是一个。那么为什么我们可以有一个“用户定义的函数对象属性”?不是所有属性都定义在一个类主体内吗
Bouns问题:提供一些示例,说明如何通过获取类的属性来创建用户定义的方法对象。对象不是在其类定义中定义的吗?(我知道方法可以分配给类实例,但这是猴子补丁。) 我请求帮助是因为文档的这一部分对我这个只懂C的程序员来说真的很困惑,因为Python是一种神奇的语言,它支持函数式编程和面向对象编程,而我还没有掌握。我已经做了很多搜索,但仍然无法找到答案。如果你找到了
class Foo(object):
def meth(self):
pass
您正在使用方法meth
定义一个类Foo
。但是,当执行该类定义时,不会创建任何方法对象来表示该方法。def
语句创建普通函数对象
如果你这样做的话
Foo.meth
或
属性查找查找函数对象,但函数对象不用作属性值。相反,Python使用调用函数对象的\uuuuu get\uuuu
方法来构造方法对象,并且该方法对象用作该查找的属性值。对于Foo.meth
,method对象是一个未绑定的method对象,其行为与您定义的函数类似,但有一些额外的类型检查。对于Foo().meth
,方法对象是绑定的方法对象,它已经知道什么是self
这就是为什么
Foo().meth()
不会抱怨缺少self
参数的原因;将0个参数传递给方法对象,然后方法对象将self
前置到(空)参数列表,并将参数传递给基础函数对象。如果直接向meth
函数计算Foo().meth
,则必须显式地传递它self
在Python3中,
Foo.meth
不创建方法对象;函数的\uuuu get\uuuu
仍然会被调用,但它会直接返回函数,因为它们认为未绑定的方法对象没有用处Foo().meth
仍然创建绑定方法对象。引文中还提到“当属性是用户定义的方法对象时,…”但是类属性怎么可能是用户定义的方法对象而不是普通的函数对象呢?额外的问题:你能提供一个例子来说明从中检索的类和存储在原始方法对象中的类之间的区别吗?@sunqingyao:class Foo(object):def method(self):pass
,类栏(对象):method=Foo.method
。现在,Bar
类的dict中有一个未绑定的方法对象,该未绑定方法记录它来自Foo
类;method2=Foo.method是指“从中检索的类与原始方法对象中存储的类相同”?@sunqingyao:CloseFoo
在class语句的主体中还不存在,因此在class语句完成后,您必须执行类似于Foo.method=Foo.method
的操作。感谢您的提问,花了一个小时的时间试图理解这一点
Foo().meth