python - 结合多重继承使用元类的类型错误

标签 python multiple-inheritance python-2.x metaclass

我有两个关于转换元类和多重继承的问题。第一个是:为什么我得到类 Derived 而不是 Derived2 的 TypeError?

class Metaclass(type): pass

class Klass(object):
    __metaclass__  = Metaclass

#class Derived(object, Klass): pass # if I uncomment this, I get a TypeError

class OtherClass(object): pass

class Derived2(OtherClass, Klass): pass # I do not get a TypeError for this

准确的错误信息是:

TypeError:调用元类基础时出错 无法为基础对象 Klass 创建一致的方法解析顺序 (MRO)

第二个问题是:为什么 super 在这种情况下不起作用(如果我使用 __init__ 而不是 __new__super 再次工作):

class Metaclass(type):
    def __new__(self, name, bases, dict_):
        return super(Metaclass, self).__new__(name, bases, dict_)

class Klass(object):
    __metaclass__  = Metaclass

我得到:

TypeError:调用元类基 type.__new__(X) 时出错: X 不是类型对象 (str)

我正在使用 Python 2.6。

最佳答案

第二个问题已经回答了两次了,虽然__new__其实是一个staticmethod,而不是评论中错误声称的classmethod...:

>>> class sic(object):
...   def __new__(cls, *x): return object.__new__(cls, *x)
... 
>>> type(sic.__dict__['__new__'])
<type 'staticmethod'>

第一个问题(正如有人指出的)与元类无关:您不能简单地从任何两个类 A 和 B 中按此顺序乘法继承,其中 B 是 A 的子类。例如:

>>> class cis(sic): pass
... 
>>> class oops(sic, cis): pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
    Cannot create a consistent method resolution
order (MRO) for bases sic, cis

MRO 保证最左边的碱基在最右边的碱基之前被访问——但它也保证在祖先中如果 x 是 y 的子类,那么 x 在 y 之前被访问。在这种情况下不可能同时满足这两个保证。这些保证当然有一个很好的理由:没有它们(例如,在旧式类中,它只保证方法解析中的左右顺序,不是子类约束)所有 x 中的重写都将被忽略赞成 y 中的定义,这没有多大意义。想一想:首先从 object 继承,然后从其他类继承是什么意思? object(本质上不存在;-)对其几个特殊方法的定义必须优先于其他类的定义,从而导致其他类的重写被忽略?

关于python - 结合多重继承使用元类的类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2203947/

相关文章:

python正则表达式单词重复时间

java - 使用具有相同方法的两个接口(interface)实现多重继承

python - 如何从 matplotlib 图形中获取方位角和仰角

python - 尝试在 Windows 上导入 pymssql 时出现 "ImportError: DLL load failed"

python - 如何仅使用返回多个值的函数的一个特定输出来操作列条目?

python - Python 3 中单元测试的预设输入

Python:以类似表格的格式将字典转储到 csv 文件的列中

c++ - 使用多重继承来满足抽象基类

python - 从 str 和 Enum 继承有哪些注意事项

Python 显示图像 - AttributeError