Passing a function as an argument from within the same class?
Terry Reedy
tjreedy at udel.edu
Fri May 1 17:37:48 EDT 2009
zealalot wrote:
> So, I'm trying to come up with a way to pass a method (from the same
> class) as the default argument for another method in the same class.
> Unfortunately though, I keep getting "self not defined" errors since
> the class hasn't been read completely before it references itself.
>
> Is there a better way of doing this?
>
> --- CODE ---
>
> class SomeClass():
> def doNothing(self):
> pass
> def function1(self):
> print "Running function 1."
> def function2(self, passedFunction=self.doNothing):
> print "Running passed function."
> passedFunction()
>
> someObject = SomeClass()
> someObject.function2(someobject.function1)
As Stephen D'Aprano indicated, this is very easy
class SomeClass():
def doNothing(self):
print("Doing nothing")
def function1(self):
print ("Running function 1.")
def function2(self, passedFunction=doNothing):
print ("Running passed function.")
passedFunction(self)
someObject = SomeClass()
someObject.function2()
someObject.function2(SomeClass.function1)
produces (with 3.0.1)
Running passed function.
Doing nothing
Running passed function.
Running function 1.
Key 1: a class statement introduces a new local namespace. The body of
the class statement is executed in that namespace. Default arguments
are evaluated, when a def statement is executed, in the local namespace
of that def statement. For methods, that is the local namespace of the
class. Hence, 'passedFunction = doNothing' works fine.
Key 2: When a parameter is a function, the signature of the default and
passed args are effectively part of the required type for the args. In
this case, passedFunction is a function with one parameter. When
captured, doNothing is not yet a method of the yet-to-become Someclass.
So non-defaults passed to .function2 do not have to be methods either.
In Python 3, unbound methods are simply functions anyway.
Terry Jan Reedy
More information about the Python-list
mailing list