标签: python-mro

直接从 Typing.NamedTuple 继承时出现奇怪的 MRO 结果

我很困惑为什么不像上面两个FooBar.__mro__那样显示<class '__main__.Parent'>

在深入研究 CPython 源代码后,我仍然不知道为什么。

from typing import NamedTuple
from collections import namedtuple

A = namedtuple('A', ['test'])

class B(NamedTuple):
  test: str

class Parent:
  pass

class Foo(Parent, A):
  pass

class Bar(Parent, B):
  pass

class FooBar(Parent, NamedTuple):
  pass

print(Foo.__mro__)
# prints (<class '__main__.Foo'>, <class '__main__.Parent'>, <class '__main__.A'>, <class 'tuple'>, <class 'object'>)

print(Bar.__mro__)
# prints (<class '__main__.Bar'>, <class '__main__.Parent'>, <class '__main__.B'>, <class 'tuple'>, <class 'object'>)

print(FooBar.__mro__)
# prints (<class '__main__.FooBar'>, <class 'tuple'>, <class 'object'>)
# expecting: (<class '__main__.FooBar'>, <class …
Run Code Online (Sandbox Code Playgroud)

python namedtuple python-3.x python-mro python-typing

7
推荐指数
2
解决办法
228
查看次数