We are trying to monkey-patch a third-party library that mixes new and old-style classes with multiple inheritance. In so doing we have uncovered some unexpected behaviour:
<quote> class Foo: pass class Bar(object): pass class Baz(Foo,Bar): pass # Monkey-patch Foo to add a special method def my_nonzero(self): print "my_nonzero called" return False Foo.__nonzero__ = my_nonzero b = Baz() print "doing the test on Baz(Foo,Bar). Should return false" if b: print "true" else: print "false" </quote> Produces this output: doing the test on Baz(Foo,Bar). Should return false true With some experimentation it is clear that this behaviour only occurs when you combine new+old-style multiple inheritance, monkey-patching and special methods. If Foo and Bar are either old or new-style it works. calling b.__nonzero__() directly works. Defining __nonzero__ within Foo works. I know this level of messing with python internals is a bit risky but I'm wondering why the above code doesn't work. Any ideas? Cheers, Stephen. -- http://mail.python.org/mailman/listinfo/python-list