On Mar 25, 10:55 pm, Steven D'Aprano <[EMAIL PROTECTED] cybersource.com.au> wrote:
[...] In my haste I forgot to finish my post: > Here's an example that might help. > > class MyClass(object): > pass > > records = ["spam", "ham"] > for record in records: > # define a new function > def f(n): > return (record + " ")*n > # create a new instance > instance = MyClass() > # and dynamically add a method to it > setattr(instance, 'execute', f) > instance.execute(5) Except it only *appears* to work. What happens if were store the instances in a list and then execute them all in one go? class MyClass(object): pass records = ["spam", "ham"] instances = [] for record in records: # define a new function def f(n): return (record + " ")*n # create a new instance instance = MyClass() # and dynamically add a method to it setattr(instance, 'execute', f) instances.append(instance) # ONLY THIS LINE CHANGED for instance in instances: instance.execute(5) Outputs: 'ham ham ham ham ham ' 'ham ham ham ham ham ' Because the name 'record' in f is bound to 'ham' after the loop. To fix this, you can for example change def f(n): ... to def f(n, record=record): ... This way, 'record' is local to f and won't change at the next iteration of the loop. -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list