super().__new__
- не та же функция, что и Base.__new__
. super().__new__
- это object.__new__
. object.__new__
не требует аргумента foo
, но Base.__new__
требует.
>>> Base.__new__
<function Base.__new__ at 0x000002243340A730>
>>> super(Base, Base).__new__
<built-in method __new__ of type object at 0x00007FF87AD89EC0>
>>> object.__new__
<built-in method __new__ of type object at 0x00007FF87AD89EC0>
Что может вас смущать, так это строка:
return super(Base,cls).__new__(cls, foo)
Это вызывает object.__new__(cls, foo)
. Это верно, он передает аргумент foo
в object.__new__
, хотя object.__new__
это не нужно. Это разрешено в python 2, но может привести к сбою в python 3. Было бы лучше удалить оттуда аргумент foo
.