Подкласс int в Python
Мне интересно подклассифицировать встроенный тип int
в Python (я использую v. 2.5), но имею некоторые проблемы с работой инициализации.
Вот пример кода, который должен быть достаточно очевиден.
class TestClass(int):
def __init__(self):
int.__init__(self, 5)
Однако, когда я пытаюсь использовать это, я получаю:
>>> a = TestClass()
>>> a
0
где я ожидаю, что результат будет 5
.
Что я делаю неправильно? Google пока не очень полезен, но я не уверен, что я должен искать
Ответы
Ответ 1
int
является неизменным, поэтому вы не можете его модифицировать после его создания, используйте __new__
вместо
class TestClass(int):
def __new__(cls, *args, **kwargs):
return super(TestClass, cls).__new__(cls, 5)
print TestClass()
Ответ 2
Хотя правильные текущие ответы могут быть неполными.
например
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(cls, 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))
def __str__(self):
return ("%d" % int(self))
def __repr__(self):
return ("positive(%d)" % int(self))
Теперь такой же тест
>>> a = positive(10)
>>> b = a - 9
>>> print(type(b))
<class '__main__.positive'>
ОБНОВИТЬ:
Добавлены примеры repr и str, чтобы новый класс печатался правильно. Также изменен синтаксис Python 3, хотя OP использовал Python 2, чтобы поддерживать актуальность.