`type`和`tuple`的子类是什么意思?

4

出于一些有趣但无关紧要的原因,我想要做以下操作:

class Head(type, tuple):
    pass

但这将导致
TypeError: multiple bases have instance lay-out conflict

在Python3.3和Python2.7上有什么解决方法吗?

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


2
你为什么认为这样做是实现 Derivative[1][g][x] 的好方法? - BrenBarn
1
继承自type是完全没有意义的;它并没有给你任何tuple没有提供的东西。 - Martijn Pieters
@BrenBarn,我想要一个类(Derivative),它有实例(Derivative[1]),这些实例本身是类,例如Derivative[1][g],它们本身也是等等。我不是说这是解决问题的好方法,但这是一种有趣的方法。基本上,我想要元类(因此我使用type),其中包含元组的__eq__(因为我将所有参数保存在元组中)。我可以使用元组作为类的属性,但这不如类本身是元组的子类那样好。所以我不明白为什么子类化type是无意义的。除了使用hack之外,还有什么其他方法可以创建元类吗? - Krastanov
我在有关Mathematica的示例中使用了Mathematica语法。因此,它不是__getitem__而是__call__。但这还不够,因为我希望遍历树时具有一致性。正如我所说,我知道有其他方法可以做到这一点,但出于美学和教育目的,我更喜欢这种方式。此外,这是实现表达式树的语义正确的方式,其中运算符本身可以是完整的其他树。 - Krastanov
1
我认为将元组作为类的属性比继承元组更好。从元组继承得到的唯一额外功能是能够说(Derivative(1)(g)(x))[2] == x,但我认为这很难理解。如果您需要获取第n个参数,则可以创建一个命名方法来实现。如果您真的喜欢数组访问语法,可以使用__getitem__将其放回。因此,我认为您应该从type而不是tuple继承。 - morningstar
显示剩余2条评论
1个回答

3
我似乎找不到一个合适的链接,但要点是Python不支持几个内置类型的多重继承。您无法创建既从"type"和"tuple"继承,也从"int"和"str"继承,或者大多数其他组合的类。这主要与实例的内部布局有关:一个"int"对象的内存布局包含整数值的存储空间;但这与"str"对象的布局不兼容,后者包含字符的存储空间。我们不知道它应该有哪个内存布局,因此不能创建同时继承两者的类的实例。
相比之下,仅直接或间接继承自 object 的类实例的内存布局如下。这样的实例只需要存储 __dict__ ,它是包含属性的字典。这对于任何多重继承图都没有问题。
这两种情况已经合并为以下“尽力而为”的方法(在Python 2.2中):仅在最多一个内置基本类型的情况下才可能进行继承。在这种情况下,内存布局可以从所需的内置类型的布局开始,并在后面包含 __dict__ 以存储其他基类所需的任何属性。

谢谢,这正是我想知道的。如果你找到了参考资料,很高兴能在这里添加。 - Krastanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接