Я хочу создать подкласс числового типа (скажем, int) в python и дать ему блестящий сложный конструктор. Примерно так:
class NamedInteger(int):
def __init__(self, value):
super(NamedInteger, self).__init__(value)
self.name = 'pony'
def __str__(self):
return self.name
x = NamedInteger(5)
print x + 3
print str(x)
Это отлично работает в Python 2.4, но Python 2.6 выдает предупреждение об устаревании. Каков наилучший способ создать подкласс числового типа и переопределить конструкторы для встроенных типов в более новых версиях Python?
Edit:
В комментариях заметили, что это работает без строки super (), поэтому это может выглядеть так:
class NamedInteger(int):
def __init__(self, value):
self.name = 'pony'
def __str__(self):
return self.name
x = NamedInteger(5)
print x + 3
print str(x)
Я считаю, что это работает, потому что тип int является неизменным и имеет только __new__
метод. Однако я был бы рад узнать правильный способ создания подклассов, чтобы я мог создать класс с таким поведением:
x = NamedInteger(5, 'kitty')
Второе редактирование:
Окончательная версия теперь выглядит так:
class NamedInteger(int):
def __new__(cls, value, name='pony'):
self = super(NamedInteger, cls).__new__(cls, value)
self.name = name
return self
def __str__(self):
return self.name
x = NamedInteger(5)
y = NamedInteger(3, 'kitty')
print "%d %d" % (x, y)
print "%s %s" % (x, y)
Ответы ниже также дали очень интересные ссылки на Абстрактные базовые классы и чисел модулей.