This looks excellent bearophile, but I'm having trouble understanding some things. Perhaps you can help wipe clean my ignorance. Firstly, I thought __classes__ was a read-only attribute? Secondly, what is a "dictproxy object" and why won't the following code work:
class Cat: def meow(self): print "meow" def MixIn(object, *classes): temp = type('ClassPie', (object.__class__,) + classes, {}) temp.__dict__.update([object.__dict__]) NewClass = MixIn(Cat(), C, D) test = NewClass() __dict__, to my understanding, is suppose to be a dictionary, but Python keeps telling me it's a 'dictproxy' object and that it has no attribute 'update'. Why is this? Thanks. [EMAIL PROTECTED] wrote: > I think it's possible, most of such kind of things are possible with > Python. > I'm not an expert yet in such kind of things, so this can be a starting > point for you (note the shadowing of m2, the class docstrings, etc). > Other people can give you something better or more correct. > > class A: > def m1(self): return "m1" > def m2(self): return "m2" > > class B: > def m3(self): return "m3" > > class P: > def m2(self): return "m2b" > def m4(self): return"m4" > > def mixin(object, *classes): > class NewClass(object.__class__): > pass > for C in classes: > NewClass.__dict__.update(C.__dict__) > object.__class__ = NewClass > > foo = P() > print "Before:" > print "foo.__class__.__dict__.keys():", foo.__class__.__dict__.keys() > print "P.__dict__.keys():", P.__dict__.keys() > print "foo.m2():", foo.m2() > print "foo.m4():", foo.m4(), "\n" > > mixin(foo, A, B) > > print "After:" > print "foo.__class__.__dict__.keys():", foo.__class__.__dict__.keys() > print "P.__dict__.keys():", P.__dict__.keys() > print "foo.m1():", foo.m1() > print "foo.m2():", foo.m2() > print "foo.m3():", foo.m3() > print "foo.m4():", foo.m4() > > Bye, > bearophile -- http://mail.python.org/mailman/listinfo/python-list