I noticed that if I define a class attribute equal to a function when I create an instance of that class the attribute becomes a bound method. Can someone explain me the reason of this behaviour?
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)
You assigned a function to the attribute A.f
(the attribute f
of the class A
). The attribute A.f
was defined as part of the class. It is a function, so it is by default an instance method of that class.
Creating an instance (named a
) of class A
causes that instance to have an attribute f
, and you access that by the name a.f
. This is a bound method (cause it's bounded to the object a
; further explanation here).
Every instance method, when it is called, automatically receives the instance as its first argument (conventionally named self
). Other types of method are possible: - see class methods and static methods.
For this reason the error says that func
takes no arguments (as it's defined as def func():
) but received 1 (self
).
To do what you want, you should tell python that you're using a static method
def func():
pass
class A(object):
f = staticmethod(func)