Уведомления

Группа в Telegram: @pythonsu

#1 Март 4, 2010 09:35:50

Asim
От:
Зарегистрирован: 2010-03-04
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с __add__ в контейнерном классе

Есть контейнерный класс tmpA который содержит объект класса А. Класс tmpA поддерживает не все методы для А. Например А + B правильно, tmpA + B нет такой операции.
Я пытаюсь через __getattr__ tmpA достучаться до методов класса А. В случае обычного метода например change все срабатывает, в случае __add__ валится TypeError usuppoted operand type for +. Причем если сделать так чтобы классы не наследовались от object то все работает. Кнопку прикрепить код не нашел.. Заранее спасибо

#--------------------------------------
class A(object):
def __init__( self, x, y ):
self.x = x
self.y = y
pass
#-------
def __add__( self, arg ):
tmp1 = self.x + arg.x
tmp2 = self.y + arg.y
return tmpA( A( tmp1, tmp2 ) )

def change( self, x, y ):
self.x = x
self.y = y
pass
pass
#------------------------------------------
class tmpA( object ):
def __init__( self, theA ):
self.A = theA
pass
#-------
def _print ( self ):
print " x =", self.A.x
print " y =", self.A.y
pass
#-------
def __call__( self ):
return self.A
#-------
def __coerce__( self, *args ):
return None

#-------
def __getattr__( self, *args ):
name = args[ 0 ]
try:
attr = None
exec "attr = self.__call__().%s" % name
return attr
except :
raise AttributeError

#--------------------------------------
class B( object ):
def __init__( self, x, y):
self.x = x
self.y = y
pass
#-------------------------------------
a=A( 1,2 )
b=B( 3,4 )
tmp_a = a + b #все в порядке
tmp_a.change( 0, 0 ) # все в порядке!!!
v = tmp_a + b #TypeError: "unsupported operand type(s) for +: 'tmpA' and 'B'"



Офлайн

#2 Март 4, 2010 11:08:16

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

Проблема с __add__ в контейнерном классе

определи __add__ для tmpA, который и будет вызываться при сложении tmpA



Офлайн

#3 Март 4, 2010 11:37:16

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с __add__ в контейнерном классе

кстате except: - плох. И зачем ‘exec “attr = self.__call__().%s” % name’ ??



Офлайн

#4 Март 4, 2010 15:55:07

Asim
От:
Зарегистрирован: 2010-03-04
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с __add__ в контейнерном классе

Dimka665
определи __add__ для tmpA, который и будет вызываться при сложении tmpA
Нельзя, к сожалению, хотя пока так и есть…



Офлайн

#5 Март 4, 2010 22:42:19

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

Проблема с __add__ в контейнерном классе

__radd__ для A, который будет работать если второй параметр имеет тип tmpA?



Офлайн

#6 Март 4, 2010 23:53:16

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с __add__ в контейнерном классе

еще вариант - __add__ такойже как __coerce__ и __getattribute__ вместо __getattr__



Отредактировано (Март 4, 2010 23:55:09)

Офлайн

#7 Март 5, 2010 10:35:20

Asim
От:
Зарегистрирован: 2010-03-04
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с __add__ в контейнерном классе

Спасибо большое, но по условиям задачи radd тоже нельзя к сожалению.
Пустой add не сработает т.к. getattribute его и выдаст



Отредактировано (Март 5, 2010 10:37:04)

Офлайн

#8 Март 5, 2010 13:13:34

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с __add__ в контейнерном классе

ну выдаст ево __getattribute__ или нет это от тебя зависит



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version