我得到了以下课程:
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.你刚才知道这种信息是有用的;-).无论如何,这个小谜语已经关闭了我同事的三个口.你将成为我当天最好的朋友......
双方Exception
并dict
在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