Python 如何断言类重写默认的哈希和等式__

Python 如何断言类重写默认的哈希和等式__,python,Python,我正在用python编写一个类装饰器。作为decorator的一部分,我想声明该类不使用默认的\uuuuuueq\uuuu和\uuuuuuuuhash\uuuu方法。我该怎么做 @identifer # should throw AssertionError class X(object): pass 我探索过这些(除了谷歌搜索和查看文档): 测试类的\uuuu dict\uuuu似乎可行,但如果类从超类继承了方法,则似乎不可行。所以我可以遍历继承图寻找方法,但我想知道是否有更干净的实

我正在用python编写一个类装饰器。作为decorator的一部分,我想声明该类不使用默认的
\uuuuuueq\uuuu
\uuuuuuuuhash\uuuu
方法。我该怎么做

@identifer # should throw AssertionError
class X(object):
    pass
我探索过这些(除了谷歌搜索和查看文档):

测试类的
\uuuu dict\uuuu
似乎可行,但如果类从超类继承了方法,则似乎不可行。所以我可以遍历继承图寻找方法,但我想知道是否有更干净的实现


这是在2.7中,但也希望它在3.x中工作,如果需要计算整个类层次结构,您可以使用:

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

只有当MRO中的任何类中没有
\uuuu eq\uuuu
属性时(对象
除外),才会返回True。这对旧式的Python 2类不起作用,因为它们没有一个类。

但是,您可能并不关心函数是否重写eq方法,只关心两个语义相同的实例是否相等。那么,为什么不测试
==
检查的行为呢?另外,您是否知道在Python2.x中,
对象
实际上并没有实现
\uuueq\uuu
<代码>对象。uuu eq_uuu
实际上是
对象
对象本身的一个实例方法;它是为
object==whatever
而调用的,而不是为
object()==whatever
而调用的。另外,您试图解决的实际问题是什么?因为这里建议的解决方案(如Martijn Pieters的解决方案)可能不适用于您。如果您需要例如hashabily,您还需要检查
\uuuuu eq\uuuu
\uuuuuu hash\uuuu
实际上是callables@user2357112:当然可以,但在Python3中是这样的,因此如果要在两个主要版本中都使用此功能,则无论如何都需要对其进行测试。:-)@JonasWielicki:如果
\uuuuuueq\uuuuu
不可调用,那么这是一个错误。支持将
None
分配给
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
以指示对象不可散列,因此它不必是可调用的。太好了!添加
mro()
部件后,效果会更好!
all('__eq__' not in cls.__dict__ for cls in X.mro() if cls is not object)