使用从内置类型继承的 super - 列表的不同结果

Using super with inheritance from builtin type - different results with list

我正在尝试创建一个自定义类型,它的行为与内置类型一样,但也会包含一些关于该值的附加信息。 代码如下:

class Value:
    def __init__(self, value):
        super().__init__()

那就行得通了:

addi_into = {x:y, ...}
base = (Value, int)
attr = {**dict(Value.__dict__), **addi_info}
_type = type('name', base, attr)
var = _type(1)

除了我可以访问 Value 中的其他信息和方法外,它的行为与 int 一样。

唯一不起作用的是当我这样做时:

addi_into = {x:y, ...}
base = (Value, list)
attr = {**dict(Value.__dict__), **addi_info}
_type = type('name', base, attr)
var = _type(['some', 'list'])

它坏了。 没有错误,只是列表是空的。

值方法和属性按预期到位。

解决方法是对列表进行特殊处理,

因为 super().__init__(value) 将其分解为其他值:

class Value:
    def __init__(self, value):
        if type(value) == list: super().__init__(value)
        else: super().__init__()

我测试的每个类型构造函数(int、str、list...)都要求该值是第一个参数,这让我有点困惑。

你能建议一个更优雅的实现方法吗?

或者解释为什么会这样?

不可变类型(例如strint)没有自己的__init__,而是继承自object。相反,它们在 __new__ 内完全初始化。对于这些类型,您可以完全省略对 super().__init__() 的调用,但仍会得到正确的结果。

要使其通用,您可能应该检查基数 class 的 __init__ 是否与 object.__init__ 不同,然后才调用它。