Python 混入抽象类和namedtuple
我想定义一个namedtuple和一个带有defines和: 据我所知,阅读文档和,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
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}))