Python:为__init__扩展int和MRO

时间:2009-07-26 11:27:59

标签: python class-design override

在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__ ......任何人都知道为什么?这是解释器中的错误吗?

3 个答案:

答案 0 :(得分:7)

Python数据模型的文档建议使用__new__

object.new(cls[, ...])

  

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

另见(接受的答案):