【问题标题】:Why can't I access .__mro__ attribute here?为什么我不能在这里访问 .__mro__ 属性?
【发布时间】:2017-03-18 06:01:33
【问题描述】:

来自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__

我理解这段代码。我不明白为什么在执行此代码时会出现此错误:

Traceback (most recent call last):
  File "study_mro.py", line 47, in <module>
    print m.__mro__
AttributeError: 'MovableColoredShape' object has no attribute '__mro__'

【问题讨论】:

    标签: python python-2.7 method-resolution-order


    【解决方案1】:

    出于神秘的原因,__mro__ 属性仅在类上可见,而在实例上不可见。

    试试这个:

    >>> m.__class__.__mro__
    (<class '__main__.MovableColoredShape'>, <class '__main__.ColoredShape'>, <class '__main__.Shape'>, <class '__main__.MoveableAdapter'>, <class '__main__.Root'>, <type 'object'>)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多