New+old-style multiple inheritance

stephenpas at googlemail.com stephenpas at googlemail.com
Tue Dec 18 10:08:49 EST 2007


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.



More information about the Python-list mailing list