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__
我理解这段代码。我不明白为什么我在执行此代码时遇到此错误:
Traceback (most recent call last):
File "study_mro.py", line 47, in <module>
print m.__mro__
AttributeError: 'MovableColoredShape' object has no attribute '__mro__'
答案 0 :(得分:4)
出于神秘的原因,__mro__
属性仅在类而非实例上可见。
请改为尝试:
>>> m.__class__.__mro__
(<class '__main__.MovableColoredShape'>, <class '__main__.ColoredShape'>, <class '__main__.Shape'>, <class '__main__.MoveableAdapter'>, <class '__main__.Root'>, <type 'object'>)