Passing to a function -- object and method names (or references)

Peter Otten __peter__ at web.de
Fri Jan 2 17:57:16 CET 2004


Midas wrote:

> I'm including code, for cut/paste, to better explain my question. I create
> a Car object then I call some of its methods. No problem. Then I try to
> pass, to a function, the name of the Car object and the name of one of its
> methods. I found one way to get this to work but can someone show me a
> more orthodox way? Is there a way using references to the object and
> somehow the method?

You can access attributes with the getattr() builtin.

carGas = getattr(car, "gas")

You can refer to a method either directly 

fun = car.drive 
fun(123)

or via getattr():

fun = getattr(car, "drive")
fun(321)

I've modified your example to demonstrate this. 

class NoGas(Exception): pass

class Car:
    def __init__(self):
        self.milespergallon = 25.0
        self.gas = 20
        self.travelled = 0
    def drive(self, miles):
        newGas = self.gas - miles/self.milespergallon
        if newGas < 0:
            self.travelled += self.milespergallon*self.gas
            self.gas = 0
            raise NoGas("%s miles travelled. No more gas" %
                self.travelled)
        self.travelled += miles
        self.gas = newGas


def printAttr(obj, attrname):
    "Demo for accessing an attribute by its name"
    print attrname, "=", getattr(obj, attrname)

def callMethod(obj, methodname, *args):
    """ Demo for calling a method determined by its name.
        An arbitrary number of arguments is just passed
        through to the method.
    """
    method = getattr(obj, methodname)
    print "calling", methodname
    method(*args)

def callMethod2(method, *args):
    """ Demo for calling a method reference.
        The method is is generated by obj.method in the
        calling code. Of course you can pass function
        references as well
    """
    method(*args)

def someFunction():
    print "Welcome to the Python Motorshow"

callMethod2(someFunction)
car = Car()
printAttr(car, "gas")
callMethod(car, "drive", 10)
printAttr(car, "gas")
while True:
    printAttr(car, "travelled")
    callMethod2(car.drive, 100)

Note that my car will not travel as far as yours as it is less satisfied
with negative amounts of gas :-)

Peter



More information about the Python-list mailing list