为什么子类化str或int的行为不同于子类化list或dict?

2024-10-02 02:38:17 发布

您现在位置:Python中文网/ 问答频道 /正文

从字符串继承时,传递给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

但是,当我从列表或dict继承时,我分别得到一个空列表或dict:

class ListChild(list):

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

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

输出:

[]

为什么会有不同的行为


Tags: 字符串textself列表initdefargumentdict
1条回答
网友
1楼 · 发布于 2024-10-02 02:38:17

初始化self.argument = argument并不是真正初始化对象本身(列表),它只是设置一个名为argument的任意属性

如果您使用的是一个相当不错的IDE,那么应该会看到一个警告,上面写着Call to __init__ of super class is missing

如果您这样做,您将得到您的列表:

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

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

你甚至不需要self.argument

现在,在子类化int时也会看到同样的警告。intlist之间的区别在于int是原始的,工作原理有点不同。你甚至不需要把argument传给super().__init__。但是,您需要将其传递给IntChild.__init__

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

print(IntChild(3))
# 3

有关int工作原理的更多详细信息,请参见this question

鼓励用户将^{}^{}子类化,而不是直接将liststr子类化,但是没有UserInt

相关问题 更多 >

    热门问题