让我们从一些代码开始:
def func(*x):
print('func:', x)
class ABC:
def __init__(self, f):
self.f1 = f
def f2(*x):
print('f2:', x)
现在我们做一些测试:
>>> a = ABC(func)
>>> a.f1(10)
func: (10,)
>>> a.f2(10)
f2: (<__main__.ABC object at 0xb75381cc>, 10)
>>> a.f3 = func
>>> a.f3(10)
func: (10,)
>>> a.f1
<function func at 0xb74911ec>
>>> a.f2
<bound method ABC.f2 of <__main__.ABC object at 0xb75381cc>>
>>> a.f3
<function func at 0xb74911ec>
请注意,这func
是一个普通函数,我们将其作为f1
类的方法。
我们可以看到这f2
是将类实例作为第一个参数,但不是f1
,f3
即使所有函数都被称为类方法。我们还可以看到,如果我们将普通函数作为类的方法来调用,Python 不会从中创建绑定方法。
那么,即使我们将其作为类的方法调用,为什么还要f1
或不将类实例传递给它呢?f3
而且,Python 是如何知道我们将外部函数作为方法调用的,所以它不应该将实例传递给它。
- 编辑 -
好的,所以基本上我做错的是我将函数附加到实例上而不是类对象本身上。因此,这些函数简单地成为实例属性。我们可以通过以下方式检查:
>>> ABC.__dict__
... contents...
>>> a.__dict__
{'f1': <function func at 0xb74911ec>, 'f3': <function func at 0xb74911ec>}
另请注意,此 dict 不能分配给:
>>> ABC.__dict__['f4'] = func
TypeError: 'dict_proxy' object does not support item assignment