Type emulation issues with new style classes

Chris feb04.20.netman at spamgourmet.com
Sat Feb 28 20:45:14 CET 2004


I'm looking for a way to do this without explicity definining every
emulation method, i.e. (__str__, __lt__, __le__, __eq__, __ne__, __gt__,
__ge__, __len__, __getitem__, __add__, __sub__, __mul__, __floordiv__,
__mod__, __divmod__, __pow__, __lshift__, ... ad nausuem).  Plus, there's a
few this isn't going to work for several of the the arithmetic operators,
such as when I want to have __add__ undefined so Python will attpemt
__radd__.  For example:

class Y:
    value = 42
    def __getattr__(self, name):
        if name == '__coerce__':
            raise AttributeError
        if name == '__add__':
            raise AttributeError
        if name == '__radd__':
            return lambda other: self.value + other.value

>>> y1, y2 = Y(), Y()
>>> print int(y1)       #This works
42
>>> print y1 + y2       #This works too
84

class Z(object):
    value = 42
    def __getattr__(self, name):
        if name == '__add__':
            raise AttributeError
        if name == '__radd__':
            return lambda other: Z.value + Z.value
        if name == '__int__':
            return lambda: self.value
    def __int__(self):
        return self.__getattr__('__int__')()
    def __add__(self, other):
        return self.__getattr__('__add__')()
    def __radd__(self, other):
        return self.__getattr__('__radd__')()


>>> z1, z2 = Z(), Z()
>>> # This following will work now, after explicitly
>>> # adding __int__ to the namespace of Z, which I'm
>>> # trying to avoid.
>>> print int(z1)
42
>>> print y1 + y2  # This bombs
TypeError: 'NoneType' object is not callable

"Rainer Deyke" wrote:
> Chris wrote:
> > class Z(object):
> >     value = 42
> >     def __hasattr__(self, name):
> >         if name == '__int__':
> >             return True
> >     def __getattr__(self, name):
> >         if name == '__int__':
> >             return lambda: self.value
>       def __int__(self):
>         return self.__getattr__('__int__')()
>
>
> -- 
> Rainer Deyke - rainerd at eldwood.com - http://eldwood.com
>
>





More information about the Python-list mailing list