如何更改实例(不在类中)的 __cmp__ 函数?
例如:
class foo:
def __init__(self, num):
self.num = num
def cmp(self, other):
return self.num - other.num
# Change __cmp__ function in class works
foo.__cmp__ = cmp
a = foo(1)
b = foo(1)
# returns True
a == b
# Change __cmp__ function in instance that way doesnt work
def cmp2(self, other):
return -1
a.__cmp__ = cmp2
b.__cmp__ = cmp2
# Raise error
a == b
#Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
#TypeError: cmp2() takes exactly 2 arguments (1 given)
最佳答案
不要这样做
这会使您的代码出现错误并且难以维护。之所以困难是因为正确的方法是继承foo
:
class FunkyCmpFoo( foo ):
def __cmp__( self, other ):
return -1
&c., &c.这样,您就知道所有的 foo
都以相同的方式进行比较,并且所有的 FunkyCmpFoo
都以相同的方式进行比较。如果不这样做,您最终会比较修改后的 foo
和原始的 foo
,克苏鲁本人会从深渊中升起来惩罚您。
我不确定我是否应该这样说,但是it is possible , 通过创建你自己的 instance methods :
funcType = type( foo.__cmp__ )
# Alternatively:
import new
cmp2 = new.instancemethod( func, a, foo )
a.__cmp__ = funcType( cmp2, a, foo )
b.__cmp__ = funcType( cmp2, b, foo )
我能想到这样做的一个很好的理由,那就是如果你的大敌必须调试代码。事实上,我可以想到一些非常有趣的事情来处理这个问题(您希望 sys.maxint
比较小于 的所有偶数?)。除此之外,这是一场噩梦。
关于python - 我如何更改实例的 __cmp__ 函数(不在类里面)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3397778/