Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с бинарными операциями, для tmpT не могу позвать add из Т 
:(
    Опции темы
sim1246
Дата 4.3.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.3.2010

Репутация: нет
Всего: нет



Есть контейнерный класс 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'"


Это сообщение отредактировал(а) sim1246 - 4.3.2010, 10:59
PM MAIL   Вверх
shupg
Дата 5.3.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 21.6.2006

Репутация: 2
Всего: 2



Привет, 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

PM MAIL   Вверх
sim1246
Дата 5.3.2010, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.3.2010

Репутация: нет
Всего: нет



Спасибо большое. Причины долго объяснять, нужно именно так как есть. Наследование не пройдет.
PM MAIL   Вверх
shupg
Дата 5.3.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 21.6.2006

Репутация: 2
Всего: 2



Насколько я понимаю, если у тебя в классе явно не переопределена функция сложения ни фига работать не будет.
Если тупо указать:

Код

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


Все начнет работать. Это похоже на фичу интерпретатора. Если это не поможет - других вариантов не знаю. Удачи!

Это сообщение отредактировал(а) shupg - 5.3.2010, 12:25
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.