help needed with classes/inheritance

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Thu Apr 24 07:28:09 EDT 2008


barbaros a écrit :
> On Apr 23, 10:48 am, Bruno Desthuilliers <bruno.
> 42.desthuilli... at websiteburo.invalid> wrote:
> 
>>> My question is: can it be done using inheritance ?
>> Technically, yes:
>>
>> class OrientedBody(Body):
>>    def __init__(self, orient=1):
>>      Body.__init__(self)
>>      self.orient = 1
>>
>> Now if it's the right thing to do is another question...
> 
> 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.

Then it's not a job for inheritence, but for composition/delegation - 
Sorry but I didn't get your specs quite right :-/

Now the good news is that Python makes composition/delegation close to 
a no-brainer:

class Body(object):
    # definitions here

class OrientedBody(object):
    # notice that we *dont* inherit from Body
    def __init__(self, body, orient):
      self._body = body
      self.orient = orient

    def __getattr__(self, name):
      try:
        return getattr(self._body, name)
      except AttributeError:
        raise AttributeError(
          "OrientedBody object has no attribute %s" % name
        )


   def __setattr__(self, name, val):
     # this one is a bit more tricky, since you have
     # to know which names are (or should be) bound to
     # which object. I use a Q&D approach here - which will break
     # on computed attributes (properties etc) in the Body class -
     # but you can also define a class attribute in either Body
     # or OrientedBody to explicitly declare what name goes where
     if name in self._body.__dict__:
       setattr(self._body, name, val)
     else:
       object.__setattr__(self, name, value)




More information about the Python-list mailing list