WrappingΒΆ

a wrapper can restrict, heritage cannot.

# ____________________________________________________________
# Base objects

class Element:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "<Element %s>"% self.name

# ____________________________________________________________
# Wrapped objects

class W_Element:
    def __init__(self, name, wrap):
        self._name = "wrapped_element" or name
        self._w = wrap

    def __getattr__(self, name):
        return getattr(self._w, name)

    def get_w(self, name):
        return getattr(self._w, name)

    def set_w(self, name, value):
        return setattr(self._w, name, value)

    _w = property (get_w, set_w)

    def __repr__(self):
        return "[W_Element %s]"% repr(self._name)

# ____________________________________________________________
# tests

e = Element('element 1')
w_e = W_Element('w_element 1', e)
e.a = 2
print w_e.a
print w_e
w_e.b = 5
print w_e.b