Passing to a function -- object and method names (or references)
Peter Otten
__peter__ at web.de
Fri Jan 2 11:57:16 EST 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