Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 3, 2009 12:18:27

ds40a
От:
Зарегистрирован: 2009-06-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс со свойствами числа ... и не только

Доброго времени суток уважаемые!

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

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

Сконструировать класс
Условие 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)


У меня пока ничего не выходит :/



Отредактировано (Июнь 3, 2009 12:42:49)

Офлайн

#2 Июнь 3, 2009 14:38:24

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс со свойствами числа ... и не только

Вопрос больше соответствует разделу ‘Python для новичков.’
http://www.python.org/doc/2.5/ref/numeric-types.html



Офлайн

#3 Июнь 3, 2009 15:58:54

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс со свойствами числа ... и не только

ох и намучился я с этой задачкой)
вариант с переопределением всем методов __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__, другими способами реализовать нужный класс.



Офлайн

#4 Июнь 3, 2009 17:51:48

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Класс со свойствами числа ... и не только

На самом деле __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. Очень хорошо изложено.



Офлайн

#5 Июнь 3, 2009 17:54:27

ds40a
От:
Зарегистрирован: 2009-06-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс со свойствами числа ... и не только

Dimka665
ох и намучился я с этой задачкой)
Спасибо огромное тезка, за время потраченное на меня,
за то, что счел нужным довести этот вопрос до полного завершения.
Ты очень помог мне!!! Легче, конечно, написать
slivlen
Вопрос больше соответствует разделу ‘Python для новичков.’
http://www.python.org/doc/2.5/ref/numeric-types.html
, несколько труднее относится к делу с вниманием.
Даже если оно на первый взгляд элементарно.
Еще раз огромное спасибо, так держать!



Офлайн

#6 Июнь 3, 2009 18:51:07

ds40a
От:
Зарегистрирован: 2009-06-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс со свойствами числа ... и не только

Андрей Светлов
На самом деле __init__ не нужен.
Андрей, спасибо за оптимизацию и за ссылку на доку.
По моему у статьи, на которую дал ссылку dimka665,
“ноги растут” из доки, указанной вами.



Офлайн

#7 Июнь 4, 2009 10:54:31

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс со свойствами числа ... и не только

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

class Entity:
...
Судя по заданию требуется создать именно класс с нуля, а не наследовать от int.



Офлайн

#8 Июнь 4, 2009 17:21:30

ds40a
От:
Зарегистрирован: 2009-06-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс со свойствами числа ... и не только

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

class Entity:
...
Судя по заданию требуется создать именно класс с нуля, а не наследовать от int.
Уважаемый, slivlen, если вы считаете , что создать класс с нуля эквивалентный классу int упражнение для начинающих, а
унаследовать новый класс от int - занятие для гуру,
тогда примите мои извинения. Действительно - не туда попал. Пойду в песочницу =)



Офлайн

#9 Июнь 4, 2009 18:09:03

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Класс со свойствами числа ... и не только

ds40a
Уважаемый, slivlen, если вы считаете , что создать класс с нуля эквивалентный классу int упражнение для начинающих, а
унаследовать новый класс от int - занятие для гуру,
тогда примите мои извинения. Действительно - не туда попал. Пойду в песочницу smile
Я считаю что и то и другое решается простым чтением документации Python или гуглением и человек не способный на такое - это, однозначно, новичек или лентяй.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version