Почему нельзя передать * args в super () .__ init __ () из класса, который переопределяет int? - PullRequest
3 голосов
/ 20 июня 2020
class MyInt(int):
   def __new__(cls, *args, **kwargs):
       print(repr(args), repr(kwargs))
       return super(MyInt, cls).__new__(cls, *args, **kwargs)
   def __init__(self, *args, **kwargs):
       print(repr(args), repr(kwargs))
       return super(MyInt, self).__init__(*args, **kwargs)

MyInt(1)

Этот код выводит:

(1,) {}
(1,) {}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-a45744cab1af> in <module>()
----> 1 MyInt(1)

<ipython-input-3-a38fc9aae2fe> in __init__(self, *args, **kwargs)
      5     def __init__(self, *args, **kwargs):
      6         print(repr(args), repr(kwargs))
----> 7         return super(MyInt, self).__init__(*args, **kwargs)
      8 

TypeError: object.__init__() takes no parameters

Кажется, что база __init__() ожидает аргументов, потому что я могу их распечатать. Так почему я не могу просто передать их методу базового класса? (Кстати, это нормально работало в python 2.7)

1 Ответ

1 голос
/ 20 июня 2020

Поскольку объект int неизменяем, вы не можете использовать метод __init__. Как объясняется в этой документации , вы только должны использовать __new__.

Здесь приоритет отдается методу __init__ при создании нового MyInt , и поэтому вы получаете ошибку. Так что просто удалите метод __init__ и оставьте метод __new__.

Надеюсь, я вам пригодился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...