gpt4 book ai didi

python - Python 中的 MRO 未按预期工作

转载 作者:行者123 更新时间:2023-12-01 02:59:21 24 4
gpt4 key购买 nike

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

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__

关于python - Python 中的 MRO 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43963641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com