函数作为类属性成为绑定方法
我注意到,如果我在创建该类的实例时定义了一个等于某个函数的类属性,该属性将成为一个绑定方法。 有人能解释我这种行为的原因吗?
In [9]: def func():
...: pass
...:
In [10]: class A(object):
....: f = func
....:
In [11]: a = A()
In [12]: a.f
Out[12]: <bound method A.func of <__main__.A object at 0x104add190>>
In [13]: a.f()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-13-19134f1ad9a8> in <module>()
----> 1 a.f()
global a.f = <bound method A.func of <__main__.A object at 0x104add190>>
TypeError: func() takes no arguments (1 given)
你为属性f
赋了一个函数。 因为函数现在在一个类内成为一个方法,特别是一个绑定的方法(导致它被绑定到对象,这里进一步解释)。
类中的方法至少会接收一个参数( self
),除非特意告知不要参见类方法和静态方法 - 因此,错误表示func
接受任何参数(因为它定义为def func():
但收到1( self
)
要做你想做的事情,你应该告诉python你正在使用静态方法
def func():
pass
class A(object):
f = staticmethod(func)
Python不是基于OO system1的消息。 相反,与JavaScript类似,属性被解析为一级函数,然后被调用; 正如发现的那样,这种行为的机制有点不同。
在Python中,要求是方法至少有一个参数,通常称为self
,当它作为方法调用时,它将自动提供给相关的实例。
此外(也可能是问题的关键),在建立实例成员绑定时,Python不区分使用def f..
或f = some_func()
。 可以说这与类之外的行为相匹配。
在该示例中,将该函数分配给实例'使得它期望被视为实例方法'。 在两种情况下都是完全相同的 - 无参数 - 函数; 只有这样的未来使用是相关的。
现在,与JavaScript不同,Python通过绑定方法的概念处理方法和对象关联 - 功能解析为方法总是“绑定”。
返回绑定方法的af
行为 - 将自动将绑定对象作为self
提供给第一个参数的函数 - 独立于函数源完成。 在这种情况下,这意味着无参数函数在“绑定”时不能使用,因为它不接受self
参数。
作为演示,以下内容将以相同的方式失败,因为源代码基础方法不符合接受实例作为参数的最低要求:
g = a.f
g()
在这种情况下调用g()
相当于调用func(a)
。
1为了便于比较,Java,C#,Ruby和SmallTalk是基于消息的OO系统 - 在这些对象中,被告知通过'name'调用方法,而不是将方法(或函数)解析为可调用的值。
链接地址: http://www.djcxy.com/p/54277.html上一篇: function as class attribute becomes a bound method
下一篇: In python, how to store 'constants' for functions only once?