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

Mic*_*uff 3 python

我正在python中编写一个类装饰器.作为装饰器的一部分,我想断言该类不使用默认__eq____hash__方法.我怎样才能做到这一点?

@identifer # should throw AssertionError
class X(object):
    pass
Run Code Online (Sandbox Code Playgroud)

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

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

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

'__eq__' in X.__dict__ # False :)?
Run Code Online (Sandbox Code Playgroud)

测试类__dict__似乎可行,但如果类从超类继承方法,它似乎不起作用.所以我可以遍历继承图寻找方法,但我想先知道是否有更清洁的实现.

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

Mar*_*ers 5

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

all('__eq__' not in cls.__dict__ for cls in X.mro() if cls is not object)
Run Code Online (Sandbox Code Playgroud)

如果__eq__MRO中的任何类中没有属性,则仅返回True ,除了object.但这对旧式Python 2类不起作用,因为它们没有class.mro()方法.