Найти - Пользователи
Полная версия: Класс со свойствами числа ... и не только
Начало » Python для экспертов » Класс со свойствами числа ... и не только
1
ds40a
Доброго времени суток уважаемые!

Дайте совет как решить задачу.

Условие задачи:

Сконструировать класс
Условие 1. класс должен иметь свойства целого числа.
Например:

class Entity:



var = Entity()

var = 5
print var -> 5

var += 3
print var -> 8

и это понятно как сделать.
Есть ли возможность выполнить второе условие?

Условие 2. экземпляр класса должен иметь возможность получить доп. данные:

синтаксически должно выглядеть так:

var = Entity()

var = 5
print var -> 5

var += 3
print var -> 8

print var.delta -> 3

либо иметь возможность вызвать некий метод этого класса
var.MyMethod(*args)


У меня пока ничего не выходит :/
slivlen
Вопрос больше соответствует разделу ‘Python для новичков.’
http://www.python.org/doc/2.5/ref/numeric-types.html
Dimka665
ох и намучился я с этой задачкой)
вариант с переопределением всем методов __add__, __mul__, __sub__, __iadd__, и прочих отметаем сразу.
и первое, что приходит на ум - это такой код:
class eint(int):        
def __init__(self, integer, delta=0):
int.__init__(self, integer)
self.delta = delta

def __iadd__(self, delta):
return eint(int(self) + delta, delta=delta)
который вываливается с ошибкой:
  File "C:/Python25/ext_integer.py", line 27, in __iadd__
return eint(int(self) + delta, delta=delta)
TypeError: 'delta' is an invalid keyword argument for this function
интуиция подсказывает, что это должно работать. даже с учетом того, что int - неизменяем, но вызывается int.__new__ с параметром delta, который не предусмотрен.

А рабочий код выглядит так:
class eint(int):
def __new__(cls, integer, delta=0):
return int.__new__(cls, integer)

def __init__(self, integer, delta=0):
self.delta = delta

def __iadd__(self, delta):
return eint(int(self) + delta, delta=delta)
если бы я сразу наткнулся на эту статейку, не потратил бы столько времени на извращения с __init__, __new__, другими способами реализовать нужный класс.
Андрей Светлов
На самом деле __init__ не нужен.
class eint(int):
def __new__(cls, integer, delta=0):
ret = int.__new__(cls, integer)
ret.delta = delta
return ret

def __iadd__(self, delta):
return eint(int(self) + delta, delta=delta)
И если уж что читать, то descrintro. Очень хорошо изложено.
ds40a
Dimka665
ох и намучился я с этой задачкой)
Спасибо огромное тезка, за время потраченное на меня,
за то, что счел нужным довести этот вопрос до полного завершения.
Ты очень помог мне!!! Легче, конечно, написать
slivlen
Вопрос больше соответствует разделу ‘Python для новичков.’
http://www.python.org/doc/2.5/ref/numeric-types.html
, несколько труднее относится к делу с вниманием.
Даже если оно на первый взгляд элементарно.
Еще раз огромное спасибо, так держать!
ds40a
Андрей Светлов
На самом деле __init__ не нужен.
Андрей, спасибо за оптимизацию и за ссылку на доку.
По моему у статьи, на которую дал ссылку dimka665,
“ноги растут” из доки, указанной вами.
slivlen
ds40a
Легче, конечно, написать , несколько труднее относится к делу с вниманием.
Ага, и еще труднее внимательно прочитать собственное задание перед тем как постить на форум:
Условие 1.  класс должен иметь свойства целого числа.
Например:

class Entity:
...
Судя по заданию требуется создать именно класс с нуля, а не наследовать от int.
ds40a
slivlen
ds40a
Легче, конечно, написать , несколько труднее относится к делу с вниманием.
Ага, и еще труднее внимательно прочитать собственное задание перед тем как постить на форум:
Условие 1.  класс должен иметь свойства целого числа.
Например:

class Entity:
...
Судя по заданию требуется создать именно класс с нуля, а не наследовать от int.
Уважаемый, slivlen, если вы считаете , что создать класс с нуля эквивалентный классу int упражнение для начинающих, а
унаследовать новый класс от int - занятие для гуру,
тогда примите мои извинения. Действительно - не туда попал. Пойду в песочницу =)
slivlen
ds40a
Уважаемый, slivlen, если вы считаете , что создать класс с нуля эквивалентный классу int упражнение для начинающих, а
унаследовать новый класс от int - занятие для гуру,
тогда примите мои извинения. Действительно - не туда попал. Пойду в песочницу smile
Я считаю что и то и другое решается простым чтением документации Python или гуглением и человек не способный на такое - это, однозначно, новичек или лентяй.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB