Почему подклассы str или int ведут себя не так, как подклассы списка или dict? - PullRequest
0 голосов
/ 10 декабря 2018

При наследовании от строки выводится значение, переданное argument:

class StringChild(str):

    def __init__(self, argument):
        self.argument = argument

print(Child("text"))

Вывод:

text

То же самое при наследовании от int:

class IntChild(int):

    def __init__(self, argument):
        self.argument = argument

print(IntChild(10))

Вывод:

10

Однако, когда я наследую от списка или диктата, я получаю пустой список или диктат соответственно:

class ListChild(list):

    def __init__(self, argument):
        self.argument = argument

print(ListChild([1,2,3]))

Вывод:

[]

Почему существует другое поведение?

1 Ответ

0 голосов
/ 10 декабря 2018

Инициализация self.argument = argument не на самом деле инициализирует сам объект (список), он просто устанавливает произвольный атрибут с именем argument.

Если вы используете полуприличную IDE, вы должны увидеть предупреждение: 1007 *.

Если вы сделаете это, вы получите свой список:

class ListChild(list):
    def __init__(self, argument):
        super().__init__(argument)
        # self.argument = argument

print(ListChild([1, 2, 3]))
# [1, 2, 3]

И вам даже не нужно self.argument.

Теперь вы увидите то же самое предупреждение и при создании подкласса int.Разница между int и list заключается в том, что int является примитивным и работает немного по-другому.Вам даже не нужно передавать argument в super().__init__.Однако вам необходимо передать его IntChild.__init__:

class IntChild(int):
    def __init__(self, argument):
        super().__init__()

print(IntChild(3))
# 3

См. этот вопрос для получения более подробной информации о том, как int работает.

Пользователям предлагается:подкласс collections.UserList и collections.UserString вместо list и str напрямую, однако UserInt нет.

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