当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能继承Python中的dict和Exception?

如何解决《为什么我不能继承Python中的dict和Exception?》经验,为你挑选了1个好方法。

我得到了以下课程:

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是基于旧的类......

编辑:是的,我试图切换继承/ init的顺序.

编辑2:我在Ubuntu8.10上使用CPython 2.4.你刚才知道这种信息是有用的;-).无论如何,这个小谜语已经关闭了我同事的三个口.你将成为我当天最好的朋友......



1> 小智..:

双方Exceptiondict在C.实现

我想你可以用以下方式测试这个:

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

由于Exception并且dict对如何在内部存储数据有不同的想法,因此它们不兼容,因此您无法同时从两者继承.

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

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

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有