gpt4 book ai didi

python - 为什么我不能从 Python 中的 dict AND Exception 继承?

转载 作者:IT老高 更新时间:2023-10-28 21:00:44 27 4
gpt4 key购买 nike

我有以下类(class):

class ConstraintFailureSet(dict, Exception) :
"""
Container for constraint failures. It act as a constraint failure itself
but can contain other constraint failures that can be accessed with a dict syntax.
"""

def __init__(self, **failures) :
dict.__init__(self, failures)
Exception.__init__(self)

print isinstance(ConstraintFailureSet(), Exception)
True
raise ConstraintFailureSet()
TypeError: exceptions must be classes, instances, or strings (deprecated), not ConstraintFailureSet

什么鬼?

最糟糕的是我不能尝试 super(),因为 Exception 是基于旧的类...

编辑:是的,我尝试切换继承/初始化的顺序。

EDIT2:我在 Ubuntu8.10 上使用 CPython 2.4。你更新知道这种信息很有用;-)。不管怎样,这个小谜语已经让我三个同事闭嘴了。你会是我今天最好的 friend ...

最佳答案

两者Exceptiondict在 C 中实现。

我认为您可以通过以下方式进行测试:

>>> class C(object): pass
...
>>> '__module__' in C.__dict__
True
>>> '__module__' in dict.__dict__
False
>>> '__module__' in Exception.__dict__
False

自从 Exceptiondict对于如何在内部存储数据有不同的想法,它们不兼容,因此您不能同时从两者继承。

在更高版本的 Python 中,您应该在尝试定义类时得到一个异常:

>>> class foo(dict, Exception):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
multiple bases have instance lay-out conflict

关于python - 为什么我不能从 Python 中的 dict AND Exception 继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/309129/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com