Adding new methods to new-style classes dynamically
Max Derkachev
max.derkachev at gmail.com
Thu May 5 04:35:09 EDT 2005
Good day to all.
Some time ago I'd been playing with a framework which uses dynamic
class creation havily. Say, I could do:
class A:
pass
# I method name is dynamic
meth_name = 'foo'
#method code can also be dynamic - any executable object will be good
enough
func = lambda self: self.__class__.__name__
A.__dict__[meth_name] = func
a = A()
print a.foo()
>> A
# methods could be added/changed at runtime, without re-instantination
A.__dict__[meth_name] = lambda self: type(self)
print a.foo()
>> <type 'instance'>
#well, try this with the new-style class
class A(object):
pass
# the new-style __dict__ is a dictproxy object
A.__dict__[meth_name] = lambda self: type(self)
>>Traceback (most recent call last):
>> File "<interactive input>", line 1, in ?
>>TypeError: object does not support item assignment
Of course, I can do
A.foo = some_executable_object
But that does help when a dynamic method name is needed.
Another option is:
exec('A.%s = %s'%('foo', 'some_executable_option'))
But I don't like eval'ling things :)
Is there other way to add/change methods to new-style classes
dynamically?
More information about the Python-list
mailing list