help needed with classes/inheritance

Paul McGuire ptmcg at austin.rr.com
Wed Apr 23 18:41:27 CEST 2008


On Apr 23, 10:44 am, barbaros <barba... at ptmat.fc.ul.pt> wrote:
>
> If I understand correctly, in the above implementation I cannot
> define firstly a (non-oriented) body, and then build, on top of it,
> two bodies with opposite orientations. The point is, I want
> both oriented bodies to share the same base Body object.

What you are describing is composition+delegation, not inheritance,
and it would be the same answer in Java, C++, or OO-langue-du-jour.
Python makes delegation to the contained object easier than the others
(except maybe for OOldj) - no need to implement all the methods of the
contained object in the container, that just delegate the call to the
contained; use __getattr__ to get attributes of the contained object
that are not defined on the container (methods are attributes, too) as
shown below.  No inheritance in this example at all.

-- Paul


class BodyWithoutOrientation(object):
    def __init__(self,color):
        self.color = color
    def show_orientation(self):
        print "I don't lean one way or the other"

class OrientedBody(object):
    def __init__(self,base,orientation):
        self.base_body = base
        self.orientation = orientation
    def show_orientation(self):
        print "I lean to the " + \
            {
            OrientedBody.RIGHT : "right",
            OrientedBody.LEFT : "left",
            }[self.orientation],
        print "and my color is " + self.color
    # delegate any other attr lookups to the base_body object
    def __getattr__(self,attr):
        return getattr(self.base_body,attr)
OrientedBody.RIGHT = object()
OrientedBody.LEFT = object()

class LeftRightBody(object):
    def __init__(self,b):
        self.common_base = b
        self.left = OrientedBody(b,OrientedBody.LEFT)
        self.right = OrientedBody(b,OrientedBody.RIGHT)
    def show_orientation(self):
        print "I do both of these:"
        print "- ",
        self.left.show_orientation()
        print "- ",
        self.right.show_orientation()

base = BodyWithoutOrientation("purple")
lr = LeftRightBody(base)

base.show_orientation()
lr.show_orientation()

Prints:
I don't lean one way or the other
I do both of these:
-  I lean to the left and my color is purple
-  I lean to the right and my color is purple



More information about the Python-list mailing list