We will now take a closer look at attributes that are methods. Let's consider an example:
class A: def func(self,arg): pass
A little inspection shows us how the nature of func changes after creating an instance:
A.func # <unbound method A.func> instA = A() # we create an instance instA.func # <bound method A.func of ... >
Calling, for example, A.func(3) would result in an error message such as this:
TypeError: func() missing 1 required positional argument: 'arg'
instA.func(3) is executed as expected. Upon creation of an instance, the method func is bound to the instance. The argument self gets the instance assigned as its value. Binding a method to an instance makes the method applicable as a function. Before that, it is of no use. Class methods, which we will consider in Section 8.4.2: Class methods, are different in this aspect.