New submission from Alexey Muranov <alexey.mura...@gmail.com>:
I expect that overriding methods with themselves like in the following example should not change the behaviour of the class: class C: a = 1 def __init__(self, b): self.b = b def f(self, x): return x*self.a + self.b + 1 @classmethod def g(cls, y): return y*cls.a + 2 @staticmethod def h(z): return z + 3 class D(C): def f(self, *args, **kwargs): return super(__class__, self).f(*args, **kwargs) @classmethod def g(cls, *args, **kwargs): return super(__class__, cls).g(*args, **kwargs) @staticmethod def h(*args, **kwargs): return super(__class__, __class__).h(*args, **kwargs) c = C(7) d = D(7) assert c.f(42) == d.f(42) assert c.g(42) == d.g(42) assert c.h(42) == d.h(42) (Moreover, I expect to be able to extend superclass method this way.) However, this does not work with `__new__`: class C: def __init__(self, x): self.x = x print(x) class D(C): @staticmethod def __new__(*args, **kwargs): return super(__class__, __class__).__new__(*args, **kwargs) C(7) # fine D(7) # TypeError: object.__new__() takes exactly one argument I think this is not a desirable feature. I would call it a bug. By the way, I understand why `object`'s `__init__` can complain about a wrong number of arguments, but I do not see a point in making `object`'s `__new__` complain about it. Here is my current workaround: class T: @staticmethod def __new__(cls, *_args, **_kwargs): return object.__new__(cls) class E(C, T): @staticmethod def __new__(*args, **kwargs): return super(__class__, __class__).__new__(*args, **kwargs) C(42) # fine E(42) # fine A possibly related issue: #32768 (https://bugs.python.org/issue32768) ---------- components: Interpreter Core messages: 341705 nosy: alexey-muranov priority: normal severity: normal status: open title: Overriding __new__ method with itself changes behaviour of the class type: behavior versions: Python 3.7, Python 3.8 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue36827> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com