Другой вариант заключается не в динамическом изменении иерархии классов, а в украшении экземпляров объектов новыми функциональными возможностями. Как правило, это проще и легче отлаживать, потому что вы изменяете только те объекты, в которых ваш код находится в элементах управления, без необходимости сквозного изменения всей иерархии классов.
def extend_object(obj):
class ExtensionClass(obj.__class__):
def new_functionality(self):
print "here"
obj.__class__ = ExtensionClass
b = Foo()
extend_object(b)
b.new_functionality()
#prints "here"