Browse Source
This adds a CPython diff that explains why calling `super().__init__()` is required in MicroPython when subclassing a native type (because `__new__` and `__init__` are not separate functions). Signed-off-by: David Lechner <david@pybricks.com>pull/12918/head
David Lechner
2 years ago
committed by
Damien George
1 changed files with 31 additions and 0 deletions
@ -0,0 +1,31 @@ |
|||
""" |
|||
categories: Core,Classes |
|||
description: When inheriting native types, calling a method in ``__init__(self, ...)`` before ``super().__init__()`` raises an ``AttributeError`` (or segfaults if ``MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG`` is not enabled). |
|||
cause: MicroPython does not have separate ``__new__`` and ``__init__`` methods in native types. |
|||
workaround: Call ``super().__init__()`` first. |
|||
""" |
|||
|
|||
|
|||
class L1(list): |
|||
def __init__(self, a): |
|||
self.append(a) |
|||
|
|||
|
|||
try: |
|||
L1(1) |
|||
print("OK") |
|||
except AttributeError: |
|||
print("AttributeError") |
|||
|
|||
|
|||
class L2(list): |
|||
def __init__(self, a): |
|||
super().__init__() |
|||
self.append(a) |
|||
|
|||
|
|||
try: |
|||
L2(1) |
|||
print("OK") |
|||
except AttributeError: |
|||
print("AttributeError") |
Loading…
Reference in new issue