如何断言类覆盖默认__hash__和__eq__

时间:2014-07-21 08:36:22

标签: python

我在python中编写了一个类装饰器。作为装饰器的一部分,我想声明该类不使用默认的__eq____hash__方法。我怎么能这样做?

@identifer # should throw AssertionError
class X(object):
    pass

我已经探索过这些(除了谷歌搜索,并查看文档):

hasattr(X, '__eq__') # True :(

xeq, oeq = X.__eq__, object.__eq__
xeq is oeq # False :(
xeq == oeq # False :(

'__eq__' in X.__dict__ # False :)?

测试班级__dict__似乎有效,但如果该类从超类继承方法,它似乎无法工作。所以我可以遍历继承图寻找方法,但我想先知道是否有更清晰的实现。

这是在2.7,但也希望它在3.x

中工作

1 个答案:

答案 0 :(得分:5)

如果需要计算整个类层次结构,可以使用:

all('__eq__' not in cls.__dict__ for cls in X.mro() if cls is not object)

如果MRO中的任何类中没有__eq__属性,则只返回True,object除外。这不适用于旧式Python 2课程,因为他们没有class.mro() method