override a property

Kay Schluehr kay.schluehr at gmx.net
Tue Oct 18 10:58:24 EDT 2005


Robin Becker wrote:
> Is there a way to override a data property in the instance? Do I need to create
> another class with the property changed?
> --
> Robin Becker

It is possible to decorate a method in a way that it seems like
property() respects overridden methods. The decorator cares
polymorphism and accesses the right method.

def overridable(f):
    def __wrap_func(self,*args,**kwd):
        func = getattr(self.__class__,f.func_name)
        if func.func_name == "__wrap_func":
            return f(self,*args,**kwd)
        else:
            return func(self,*args,**kwd)
    return __wrap_func


class A(object):
    def __init__(self, x):
        self._x = x

    @overridable
    def get_x(self):
        return self._x

    x = property(get_x)

class B(A):

    def get_x(self):
        return self._x**2

class C(B):pass

>>> a = A(7)
>>> a.x
7
>>> b = B(7)
>>> b.x
49
>>> c = C(7)
>>> c.x
49




More information about the Python-list mailing list