2009-07-26 11 views
10

In Python, versuche ich den eingebauten 'int' Typ zu erweitern. Dabei möchte ich in einigen keywoard Argumente an den Konstruktor übergeben, so dass ich dies tun:Python: extending int und MRO für __init__

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

jedoch während C(3) Aufruf funktioniert gut, C(3, a=4) gibt:

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

und C.__mro__ gibt die erwartete:

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

Aber es scheint, dass Python versucht int.__init__ zuerst zu nennen ... Wer weiß, warum? Ist das ein Fehler im Interpreter?

Antwort

7

Die Dokumentation für die Python-Datenmodell Beratung mit __new__:

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

neuen() hauptsächlich dazu gedacht ist Subklassen von unveränderlichen Typen zu ermöglichen (wie int, str oder Tupel) zu Anpassen der Instanzerstellung Es wird auch häufig in benutzerdefinierten Metaklassen außer Kraft gesetzt, um die Klassenerstellung anzupassen.

So etwas sollte es für das Beispiel tun Sie gab:

class C(int): 

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

Sie sollten überschrieben werden "__new__", nicht "__init__" als ints sind unveränderlich.