e-s*_*tis 18 python multiple-inheritance
我得到了以下课程:
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
Run Code Online (Sandbox Code Playgroud)
有没有搞错 ?
最糟糕的是我不能尝试super(),因为Exception是基于旧的类......
编辑:是的,我试图切换继承/ init的顺序.
编辑2:我在Ubuntu8.10上使用CPython 2.4.你刚才知道这种信息是有用的;-).无论如何,这个小谜语已经关闭了我同事的三个口.你将成为我当天最好的朋友......
小智 21
双方Exception
并dict
在C.实现
我想你可以用以下方式测试这个:
>>> class C(object): pass
...
>>> '__module__' in C.__dict__
True
>>> '__module__' in dict.__dict__
False
>>> '__module__' in Exception.__dict__
False
Run Code Online (Sandbox Code Playgroud)
由于Exception
并且dict
对如何在内部存储数据有不同的想法,因此它们不兼容,因此您无法同时从两者继承.
在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
Run Code Online (Sandbox Code Playgroud)