Python:为__init__扩展int和MRO

10 python overriding class-design

在Python中,我试图扩展内置'int'类型.这样做我想将一些keywoard参数传递给构造函数,所以我这样做:

class C(int):
     def __init__(self, val, **kwargs):
         super(C, self).__init__(val)
         # Do something with kwargs here...
Run Code Online (Sandbox Code Playgroud)

虽然调用C(3)工作正常,但C(3, a=4)给出:

'a' is an invalid keyword argument for this function` 
Run Code Online (Sandbox Code Playgroud)

C.__mro__返回预期的:

(<class '__main__.C'>, <type 'int'>, <type 'object'>)
Run Code Online (Sandbox Code Playgroud)

但似乎Python试图先打电话int.__init__......任何人都知道为什么?这是解释器中的错误吗?

Jar*_*die 7

Python数据模型的文档建议使用__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
Run Code Online (Sandbox Code Playgroud)