`type`和`tuple`的子类

时间:2013-06-02 17:21:06

标签: python python-3.x metaclass symbolic-math

对于一个有趣(且有效但无关)的原因,我想做以下事情:

class Head(type, tuple):
    pass

但这会导致

TypeError: multiple bases have instance lay-out conflict

(在python3.3和python2.7上)

有什么方法吗?

对于好奇的我想创建一些行为类似于Mathematica表达式(Derivative[1][g][x]g'(x))的东西。我知道还有其他方法,但出于教育目的,我坚持这个。

1 个答案:

答案 0 :(得分:3)

我似乎无法找到适当的链接,但重点是Python不支持多种内置类型的多重继承。您不能创建一个继承“type”和“tuple”,或“int”和“str”或大多数其他组合的类。与实例的内部布局有关的主要内部原因是:“int”对象的内存布局包含整数值的存储;但这与“str”对象的布局是不相容的,该对象包含字符的存储。创建一个可以从两者继承的类的实例是不可能的,因为我们不知道它应该具有哪种内存布局。

将此与仅直接或间接从object继承的类实例的内存布局进行比较。这样的实例只需要存储__dict__,这是一个包含属性的字典。对于任何多重继承图,这都没有问题。

将这两个案例(在Python 2.2中)合并到以下“尽力而为”的appraoch中:只有在最多有一个内置基类型时,才能实现继承。在这种情况下,内存布局可以从此内置类型的预期布局开始,然后包含__dict__以存储其他基类所需的任何属性。