2009-07-26 10 views
10

In Python, sto cercando di estendere il tipo 'int' incorporato. In questo modo voglio passare in alcuni argomenti keywoard al costruttore, quindi faccio questo:Python: estensione int e MRO per __init__

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

Tuttavia durante la chiamata C(3) funziona bene, C(3, a=4) dà:

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

e C.__mro__ restituisce l'atteso:

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

Ma sembra che Python sta tentando di chiamare int.__init__ prima ... Qualcuno sa perché? È un bug nell'interprete?

risposta

7

La documentazione per il modello di dati consiglio Python utilizzando __new__:

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

nuova() è destinato principalmente a consentire sottoclassi di tipi immutabili (come int, str o tuple) per personalizzare la creazione dell'istanza. Inoltre, è comunemente sovrascritto nei metaclassi personalizzati per personalizzare la creazione della classe.

Qualcosa del genere dovrebbe farlo per l'esempio che hai dato:

class C(int): 

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

È necessario ignorare "__new__", non "__init__" poiché gli int sono immutabili.