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所以classPrintable
这样使用:
>>> from printable import *
>>> class MySeq(list, Printable):
... pass
...
>>> my_seq = MySeq([1,2,3])
>>> print(my_seq)
MySeq[1, 2, 3]
我的问题是为什么__str__
方法继承自Printable
class而不是list
class,而方法解析顺序MySeq
的是:
>>> MySeq.__mro__
(<class '__main__.MySeq'>, <class 'list'>, <class 'printable.Printable'>, <class 'object'>)
在 Printable
的文档字符串中,我注意到 "mixin" 这个词。为什么在这种情况下我们称它为 mixin class?
list
没有定义 __str__
方法:
>>> '__str__' in list.__dict__
False
因为它没有定义这样的方法,所以 MRO 中的下一个 class 开始提供它。对于一个普通的 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
混合 class 是一种 class,旨在添加到 class 层次结构中,以便与其他基础 class 一起工作。 Printable
是一个混合,因为它需要其他东西实现 __getitem__
.
我找到了一个多重继承的例子,但不明白它的行为方式。
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所以classPrintable
这样使用:
>>> from printable import *
>>> class MySeq(list, Printable):
... pass
...
>>> my_seq = MySeq([1,2,3])
>>> print(my_seq)
MySeq[1, 2, 3]
我的问题是为什么__str__
方法继承自Printable
class而不是list
class,而方法解析顺序MySeq
的是:
>>> MySeq.__mro__
(<class '__main__.MySeq'>, <class 'list'>, <class 'printable.Printable'>, <class 'object'>)
在 Printable
的文档字符串中,我注意到 "mixin" 这个词。为什么在这种情况下我们称它为 mixin class?
list
没有定义 __str__
方法:
>>> '__str__' in list.__dict__
False
因为它没有定义这样的方法,所以 MRO 中的下一个 class 开始提供它。对于一个普通的 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
混合 class 是一种 class,旨在添加到 class 层次结构中,以便与其他基础 class 一起工作。 Printable
是一个混合,因为它需要其他东西实现 __getitem__
.