Don't work __getattr__ with __add__

Андрей Симурзин asimurzin at gmail.com
Thu Mar 4 03:25:21 EST 2010


It is object of the class A, in conteiner's class tmpA. Not all method
from A are in the tmpA. So for exapmle:
A + B -- yes , tmpA + B no. I try to call method from A for tmpA. I
can to call simple method,  such as change(), bit __add__ -  don't
work. If to remove inheritance from object, the code work's. Help me,
please
#--------------------------------------
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  #well
tmp_a.change( 0, 0 ) # very well !!!
v = tmp_a + b  #TypeError: "unsupported operand type(s) for +: 'tmpA'
and 'B'"



More information about the Python-list mailing list