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

Posted

技术标签:

【中文标题】术语:用户定义的函数对象属性?【英文标题】:Terminology: A user-defined function object attribute? 【发布时间】:2016-11-29 03:01:48 【问题描述】:

根据 Python 2.7.12 文档,User-defined methods:

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

我知道 Python 中的一切都是对象,因此“用户定义的方法”必须与“用户定义的方法对象”相同。但是,我不明白为什么会有“用户定义的函数对象属性”。比如说,在下面的代码中:

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

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


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

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

【问题讨论】:

感谢您提出这个问题,花了一个小时来理解这个问题 【参考方案1】:

当你这样做时

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

您正在使用方法meth 定义一个类Foo。但是,当执行此类定义时,不会创建方法对象来表示该方法。 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 仍然会创建一个绑定的方法对象。

【讨论】:

引文还说“当属性是用户定义的方法对象时,……”但是一个类属性怎么可能是一个用户定义的方法对象而不是一个普通函数对象? 额外问题:您能否提供一个示例说明从中检索它的类存储在原始方法对象中的类? @sunqingyao:class Foo(object): def method(self): passclass Bar(object): method = Foo.method。现在Bar 类在其dict 中有一个未绑定的方法对象,并且该未绑定方法记录它来自Foo 类。 如果class Foo(object): def method(self): pass; method2 = Foo.method是“从中检索它的类与存储在原始方法对象中的类相同”的情况? @sunqingyao:关闭。 Foo 在 class 语句的主体中尚不存在,因此您必须在 class 语句完成后执行Foo.method = Foo.method 之类的操作。

以上是关于术语:用户定义的函数对象属性?的主要内容,如果未能解决你的问题,请参考以下文章

规范化建模之术语表

Python_函数术语列表

Python_函数术语列表

Python类与对象最全总结大全(类实例属性方法继承派生多态内建函数)

python 面向对象编程

python比较之面向对象