我在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
中工作答案 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。