← index #2028PR #15533
Related · high · value 0.928
QUERY · ISSUE

super() appears not to work with multiple inheritance

openby peterhinchopened 2016-05-03updated 2016-06-19
bug

This derives from this forum post.

class A:
    def __init__(self):
        print("A.__init__")

class B(A):
    def __init__(self):
        print("B.__init__")
        super().__init__()

class C(A):
    def __init__(self):
        print("C.__init__")
        super().__init__()


class D(B,C):
    def __init__(self):
        print("D.__init__")
        super().__init__()

If you issue D() at the REPL you get:

>>> D()
D.__init__
B.__init__
A.__init__
<D object at aac31180>

whereas cPython gives:

>>> D()
D.__init__
B.__init__
C.__init__
A.__init__
<__main__.D object at 0x7f40ecd1a358>
>>> 

A further issue with super() - with single inheritance - is this. Despite numerous successful uses I wrote one class where super() returned an empty string. Unfortunately any attempt to produce a test case failed. I appreciate that's a lousy bug report but I thought it worth mentioning if the code is being reviewed.

CANDIDATE · PULL REQUEST

py/runtime: Fix self arg passed to classmethod when accessed via super.

mergedby dpgeorgeopened 2024-07-24updated 2024-07-25
py-core

Summary

MicroPython was not conforming to CPython behaviour when using super() within a classmethod. This patch fixes this behaviour.

Testing

New test added which did not pass before, but now passes.

Thanks to @AJMansfield for the original test case.

Trade-offs and Alternatives

This increases code size a little bit, but if not fixed it can lead to some very difficult to debug problems, if you even notice there's a problem in the first place.

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied