Python 中的 MRO 无法按预期工作



我找到了一个多重继承的例子,但不了解它的行为方式。

class Printable:
    """A mixin class for creating a __str__ method that prints
    a sequence object. Assumes that the type difines __getitem__."""
    def lef_bracket(self):
        return type(self).__name__ + "["
    def right_bracket(self):
        return "]"
    def __str__(self):
        result = self.lef_bracket()
        for i in range(len(self)-1):
            result += str(self[i]) + ", "
        if len(self) > 0:
            result += str(self[-1])
        return result + self.right_bracket()

此脚本存储在 printable.py 中,因此类Printable以这种方式使用:

>>> from printable import *
>>> class MySeq(list, Printable):
...     pass
... 
>>> my_seq = MySeq([1,2,3])
>>> print(my_seq)
MySeq[1, 2, 3]

我的问题是,为什么 __str__ 方法继承自 Printable 类而不是 list 类,而 MySeq 的方法解析顺序是:

>>> MySeq.__mro__
(<class '__main__.MySeq'>, <class 'list'>, <class 'printable.Printable'>, <class 'object'>)

Printable的文档字符串中,我注意到"mixin"这个词。为什么在这种情况下我们称它为mixin类?

list没有定义__str__方法:

>>> '__str__' in list.__dict__
False

因为它没有定义这样的方法,所以MRO中的下一个类将提供它。对于一个普通list对象,这将是object.__str__

>>> list.__mro__
(<class 'list'>, <class 'object'>)
>>> list.__str__ is object.__dict__['__str__']
True

但由于混Printable,所以列object之前

>>> MySeq.__mro__
(<class '__main__.MySeq'>, <class 'list'>, <class '__main__.Printable'>, <class 'object'>)
>>> MySeq.__str__ is Printable.__dict__['__str__']
True

混合类是设计为添加到类层次结构中以与其他基类协同工作的类。 Printable是混合的,因为它需要其他东西来实现__getitem__

相关内容

  • 没有找到相关文章

最新更新