簡體   English   中英

Python中的MRO無法正常工作

[英]MRO in Python doesn't work as expected

我找到了一個多重繼承的示例,但不了解它的行為方式。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM