2010-07-13 4 views
34

Мне интересно подклассифицировать встроенный тип int в Python (я использую v. 2.5), но некоторые проблемы с работой инициализации.Subclassing int in Python

Вот пример кода, который должен быть достаточно очевиден.

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

Однако, когда я пытаюсь использовать это я получаю:

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

, где я бы ожидать, что результат будет 5.

Что я делаю неправильно? Google, до сих пор не было очень полезно, но я не совсем уверен, что я должен искать для

+2

Этот вопрос StackOverflow охватывает ту же тему более подробно: HTTP: //stackoverflow.com/questions/33534/extending-base-classes-in-python – sunetos

+0

Также здесь: http://stackoverflow.com/questions/399022/why-cant-i-subclass-datetime-date – Arkady

ответ

54

int неизменна, так что вы не можете изменить его после того, как он будет создан, используйте __new__ вместо

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

print TestClass() 
3

Хотя правильные текущие ответы потенциально не завершены.

например.

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

Показать b как целое число, где вы можете захотеть, чтобы это было TestClass.

Вот улучшенный ответ

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)) 

Теперь же рода тест

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

напечатает «позитивный»