Python 混入抽象类和namedtuple

Python 混入抽象类和namedtuple,python,Python,我想定义一个namedtuple和一个带有defines和: 据我所知,阅读文档和,c.do()应该会引发一个错误,因为c类没有实现do()。然而,当我运行它时。。。它的工作原理是: B(x=3, y=4) U Can't Touch This 我一定忽略了什么。当您查看C的方法解析顺序时,您会发现B在该列表中位于a之前。这意味着在实例化C时,将首先调用B的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu新方法 这是名为tuple的的实现 def __new__(_cls

我想定义一个namedtuple和一个带有defines和:

据我所知,阅读文档和,
c.do()
应该会引发一个错误,因为c类没有实现
do()
。然而,当我运行它时。。。它的工作原理是:

B(x=3, y=4)
U Can't Touch This

我一定忽略了什么。

当您查看
C
的方法解析顺序时,您会发现
B
在该列表中位于
a
之前。这意味着在实例化
C
时,将首先调用
B
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu新方法

这是名为tuple的
的实现

def __new__(_cls, {arg_list}):
    'Create new instance of {typename}({arg_list})'
    return _tuple.__new__(_cls, ({arg_list}))
您可以看到,它不支持协作继承,因为它会断开链并简单地调用
tuple
s
\uuuu new\uuu
方法。像这样,检查抽象方法的
ABCMeta.\uuuuu new\uuuu
方法永远不会执行(无论在什么地方),也不能检查抽象方法。因此,实例化不会失败


我原以为反转MRO可以解决这个问题,但奇怪的是它没有。我将进一步调查并更新这个答案。

可能反转MRO并不重要,因为
B
实现了
\uuuuuu新的
,而
a
没有。但是
namedtuple
ABCMeta
都有一个
\uu新的
方法。MRO深度优先搜索不是吗?有点像。参见此示例:
>>类X(B,A):。。。通过…>>>X。。。通过…>>>Y.。\uuuMRO\uuuuu(,)
。无论哪种方式,元组都是首先调用的,因为它们最终都派生自object.ABCMeta是一种类型。它是
\uuuuu new\uuuu
函数只在创建类时调用,而不是在创建对象时调用。是的,我很困惑,当然
ABCMeta.\uuuu new\uuuu
是在不同的时间调用的。但是我仍然不明白如何在
对象中检查抽象方法。有代码可以检查吗?为什么它在
object.\uuuuu new\uuuu
中,而不是在
ABCMeta.\uuuu call\uuuuu
中,这对我来说是有意义的。你使用的是什么版本的python?元类在Python2和Python3中以不同的、不兼容的方式调用。如果您使用的是Python3,那么您的类实际上不是一个抽象类。同样的行为。
def __new__(_cls, {arg_list}):
    'Create new instance of {typename}({arg_list})'
    return _tuple.__new__(_cls, ({arg_list}))