Подклассы int в Python - PullRequest
       6

Подклассы int в Python

42 голосов
/ 13 июля 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

60 голосов
/ 13 июля 2010

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

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

print TestClass()
7 голосов
/ 13 сентября 2017

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

например,

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 для поддержания релевантности.

...