2009-07-26 18 views
10

En Python, estoy tratando de extender el tipo 'int' incorporado. Al hacerlo quiero pasar en algunos argumentos keywoard al constructor, por lo que hago esto:Python: extensión int y MRO para __init__

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

Sin embargo, mientras que llamando C(3) funciona bien, C(3, a=4) da:

'a' is an invalid keyword argument for this function` 

y C.__mro__ devuelve la espera:

(<class '__main__.C'>, <type 'int'>, <type 'object'>) 

Pero parece que Python está intentando llamar int.__init__ primera ... Alguien sabe por qué? ¿Es esto un error en el intérprete?

Respuesta

7

la documentación para el Python modelo de datos consejo usando __new__:

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

nuevo() se destina principalmente a permitir subclases de tipos inmutables (como int, str, o tupla) a personalizar la creación de instancias También se anula comúnmente en metaclases personalizadas para personalizar la creación de clase.

Algo así debe hacerlo por el ejemplo que diste:

class C(int): 

    def __new__(cls, val, **kwargs): 
     inst = super(C, cls).__new__(cls, val) 
     inst.a = kwargs.get('a', 0) 
     return inst 
3

Debe reemplazar "__new__", no "__init__" como ints son inmutables.