我正在编写一个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中工作。
__eq__
不可调用,那么就是一个错误。将None
赋值给__hash__
是被支持的,以表明对象不可哈希,因此它不必是可调用的。 - Martijn Pieters