Promoting Python
Rolf Camps
rolf at roce.be
Wed Apr 6 19:40:29 EDT 2016
Op 07-04-16 om 00:03 schreef Marko Rauhamaa:
> Once you look up an object method, it doesn't have a self argument. The
> self argument is cooked up for the benefit of the function definition in
> the class.
>
> IOW, if I have this class:
>
> class A:
> def f(self):
> print("f")
>
> and this object:
>
> a = A()
>
> then,
>
> a.f
>
> is a function that doesn't have a self argument. That function is
> generated on the fly, and it delegates to A.f, providing it with self
> argument.
a.f is not a function, A.f is a function.
a.f is an instance method. The function is not generated on the fly,
when the method is called, it calls the function A.f with an extra
argument __self__ (the instance a) inserted before the argument list the
instance method was called with.
So calling a.f() is a convenient way to write A.f(a)
>
> However, a.f itself is just a function that doesn't accept any
> arguments.
As i wrote, a.f is an instance method not a function. It accepts any
argument you trow at it, insert 'a' in front of the argument list and
calls the function A.f with this new argument list.
>
> Defining:
>
> def f():
> print("f")
> a.f = f
>
> simply short-circuits the attribute lookup process; no need to consult
> the class when the attribute (method!) is right there in the object's
> dict.
Here a.f is a function so Python will treat is as a function. When you
call it, the lookup process will find f in the class instance
dictionary, discover it's a function and run it with the arguments
provided. If you would like to use attributes of the class A or of the
instance 'a' in f, you would need to hard code it in the function since
the function f does not know it was called from 'a', an instance of the
class A.
>
>
> Marko
More information about the Python-list
mailing list