Проблема с бинарными операциями

 
0
 
Python
ava
sim1246 | 04.03.2010, 10:57
Есть контейнерный класс 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 __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'"
Kommentare (3)
ava
shupg | 05.03.2010, 11:07 #
Привет, sim1246!

Вообще не сильно понял причины такого подхода.. Но если целью было нормально складывать tmp_a + b и чтобы функция change нормально работала надо так:


class A(object):
def __init__( self, x, y ):
self.x = x
self.y = y
#-------
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
#------------------------------------------
class tmpA(A):
def __init__( self, theA ):
A.__init__(self, theA.x, theA.y)

#--------------------------------------
class B( object ):
def __init__( self, x, y):
self.x = x
self.y = y
ava
sim1246 | 05.03.2010, 11:43 #
Спасибо большое. Причины долго объяснять, нужно именно так как есть. Наследование не пройдет.
ava
shupg | 05.03.2010, 12:24 #
Насколько я понимаю, если у тебя в классе явно не переопределена функция сложения ни фига работать не будет.
Если тупо указать:


class tmpA( object ):
def __add__(self,a):
self.__call__().__add__(a)


Все начнет работать. Это похоже на фичу интерпретатора. Если это не поможет - других вариантов не знаю. Удачи!
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  shupg   sim1246
advanced
Absenden