2010-07-13 11 views
34

Ich bin interessiert an Unterklasse der integrierten int geben Sie in Python (ich v. V. 2.5), aber einige Probleme bekommen die Initialisierung funktioniert.Subclassing Int in Python

Hier ist ein Beispielcode, der ziemlich offensichtlich sein sollte.

class TestClass(int): 
    def __init__(self): 
     int.__init__(self, 5) 

Allerdings, wenn ich versuche, dies zu verwenden, erhalte ich:

>>> a = TestClass() 
>>> a 
0 

wo ich das Ergebnis 5 sein erwarten würde.

Was mache ich falsch? Google, so weit, hat sich als sehr hilfreich gewesen, aber ich bin nicht wirklich sicher, was soll ich für

+2

Diese Frage Stackoverflow deckt das gleiche Thema im Detail: http: //stackoverflow.com/questions/33534/extending-base-classes-in-python – sunetos

+0

Auch hier: http://stackoverflow.com/questions/399022/why-cant-i-subclass-datetime-date – Arkady

Antwort

54

int ist unveränderlich werden gesucht, so dass Sie es nicht ändern, nachdem es erstellt wird, verwenden __new__ statt

class TestClass(int): 
    def __new__(cls, *args, **kwargs): 
     return super(TestClass, cls).__new__(cls, 5) 

print TestClass() 
3

Obwohl korrekt sind die aktuellen Antworten möglicherweise nicht vollständig.

z.B.

a = TestClass() 
b = a - 5 
print type(b) 

Würde b als Integer anzeigen, wo Sie möchten, dass es sich um eine TestClass handelt. Hier

ist eine verbesserte Antwort

class positive(int): 
    def __new__(cls, value, *args, **kwargs): 
     if value < 0: 
      raise ValueError, "positive types must not be less than zero" 
     return super(positive, cls).__new__(cls, value) 

    def __add__(self, other): 
     res = super(positive, self).__add__(other) 
     return self.__class__(max(res, 0)) 

    def __sub__(self, other): 
     res = super(positive, self).__sub__(other) 
     return self.__class__(max(res, 0)) 

    def __mul__(self, other): 
     res = super(positive, self).__mul__(other) 
     return self.__class__(max(res, 0)) 

    def __div__(self, other): 
     res = super(positive, self).__div__(other) 
     return self.__class__(max(res, 0)) 

Nun ist die gleiche Art von Test

a = positive(10) 
b = a - 9 
print type(b) 

würde drucken 'positiv'