multiple inheritance with builtins

Giovanni Bajo noway at
Sun Mar 6 04:03:11 CET 2005


I noticed that bultin types like list, set, dict, tuple don't seem to adhere to
the convention of using super() in constructor to correctly allow
diamond-shaped inheritance (through MRO). For instance:

>>> class A(object):
...     def __init__(self):
...             print "A.__init__"
...             super(A, self).__init__()
>>> class B(A, list):
...     def __init__(self):
...             print "B.__init__"
...             super(B, self).__init__()
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <type 'list'>, <type 'object'>)
>>> B()
>>> class C(list, A):
...     def __init__(self):
...             print "C.__init__"
...             super(C, self).__init__()
>>> C.__mro__
(<class '__main__.C'>, <type 'list'>, <class '__main__.A'>, <type 'object'>)
>>> C()

It seems weird to me that I have to swap the order of bases to get the expected
behaviour. Is there a reason for this, or is it simply a bug that should be
Giovanni Bajo

More information about the Python-list mailing list