在Python中,我正在尝试扩展内置'int'类型。在这样做时,我想将一些keywoard参数传递给构造函数,所以我这样做:
class C(int):
def __init__(self, val, **kwargs):
super(C, self).__init__(val)
# Do something with kwargs here...
但是,在调用C(3)
时工作正常,C(3, a=4)
会给出:
'a' is an invalid keyword argument for this function`
和C.__mro__
返回预期的:
(<class '__main__.C'>, <type 'int'>, <type 'object'>)
但似乎Python首先试图调用int.__init__
......任何人都知道为什么?这是解释器中的错误吗?
答案 0 :(得分:7)
Python数据模型的文档建议使用__new__
:
new ()主要用于允许不可变类型的子类(如int,str或tuple)自定义实例创建。它也通常在自定义元类中重写,以自定义类创建。
这样的事情应该是你给出的例子:
class C(int):
def __new__(cls, val, **kwargs):
inst = super(C, cls).__new__(cls, val)
inst.a = kwargs.get('a', 0)
return inst
答案 1 :(得分:3)
你应该压倒一切
"__new__"
,而不是"__init__"
,因为整数是不可变的。
答案 2 :(得分:3)
其他人(到目前为止)所说的话。 Int是不可变的,因此您必须使用 new 。
另见(接受的答案):