Example from Raymond Hettinger's recepie
class Root(object):
def draw(self):
# the delegation chain stops here
assert not hasattr(super(Root, self), 'draw')
class Shape(Root):
def __init__(self, shapename, **kwds):
self.shapename = shapename
super(Shape, self).__init__(**kwds)
def draw(self):
print 'Drawing. Setting shape to:', self.shapename
super(Shape, self).draw()
class ColoredShape(Shape):
def __init__(self, color, **kwds):
self.color = color
super(ColoredShape, self).__init__(**kwds)
def draw(self):
print 'Drawing. Setting color to:', self.color
super(ColoredShape, self).draw()
# ------- Show how to incorporate a non-cooperative class --------
class Moveable(object):
# non-cooperative class that doesn't use super()
def __init__(self, x, y):
self.x = x
self.y = y
def draw(self):
print 'Drawing at position:', self.x, self.y
class MoveableAdapter(Root):
# make a cooperative adapter class for Moveable
def __init__(self, x, y, **kwds):
self.moveable = Moveable(x, y)
super(MoveableAdapter, self).__init__(**kwds)
def draw(self):
self.moveable.draw()
super(MoveableAdapter, self).draw()
class MovableColoredShape(ColoredShape, MoveableAdapter):
pass
m = MovableColoredShape(color='red', shapename='triangle', x=10, y=20)
m.draw()
print m.__mro__
I understand this code. What I don't understand is why am I getting this error on executing this code:
Traceback (most recent call last):
File "study_mro.py", line 47, in <module>
print m.__mro__
AttributeError: 'MovableColoredShape' object has no attribute '__mro__'
For arcane reasons, the __mro__
attribute is only visible on the class rather than the instance.
Try this instead:
>>> m.__class__.__mro__
(<class '__main__.MovableColoredShape'>, <class '__main__.ColoredShape'>, <class '__main__.Shape'>, <class '__main__.MoveableAdapter'>, <class '__main__.Root'>, <type 'object'>)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With