我正在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中工作
如果整个类层次结构需要计数,您可以使用:
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()方法.