2009-07-26 4 views
10

En Python, j'essaye d'étendre le type int 'intégré. Ce faisant, je veux passer quelques arguments keywoard au constructeur, donc je le fais:Python: extension int et MRO pour __init__

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

Cependant, tout en appelant C(3) fonctionne très bien, C(3, a=4) donne:

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

et C.__mro__ retourne l'attend:

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

Mais il semble que Python essaie d'appeler int.__init__ d'abord ... Quelqu'un sait pourquoi? Est-ce un bug dans l'interprète?

Répondre

7

Les documents pour les conseils de modèle de données Python en utilisant __new__:

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

nouvelle() vise principalement à permettre aux sous-classes de types immuables (comme int, str, ou tuple) à personnaliser la création d'instance. Il est également souvent substitué dans les métaclasses personnalisées afin de personnaliser la création de classe.

Quelque chose comme cela devrait le faire pour l'exemple que vous avez donné:

class C(int): 

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

Vous devez écraser "__new__", et non "__init__" comme les entiers sont immuables.

Questions connexes