使用从内置类型继承的 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...)都要求该值是第一个参数,这让我有点困惑。
你能建议一个更优雅的实现方法吗?
或者解释为什么会这样?
不可变类型(例如str
、int
)没有自己的__init__
,而是继承自object
。相反,它们在 __new__
内完全初始化。对于这些类型,您可以完全省略对 super().__init__()
的调用,但仍会得到正确的结果。
要使其通用,您可能应该检查基数 class 的 __init__
是否与 object.__init__
不同,然后才调用它。
我正在尝试创建一个自定义类型,它的行为与内置类型一样,但也会包含一些关于该值的附加信息。 代码如下:
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...)都要求该值是第一个参数,这让我有点困惑。
你能建议一个更优雅的实现方法吗?
或者解释为什么会这样?
不可变类型(例如str
、int
)没有自己的__init__
,而是继承自object
。相反,它们在 __new__
内完全初始化。对于这些类型,您可以完全省略对 super().__init__()
的调用,但仍会得到正确的结果。
要使其通用,您可能应该检查基数 class 的 __init__
是否与 object.__init__
不同,然后才调用它。