如何更改实例的__cmp__函数(不在类中)?

Dan*_*oNC 5 python metaprogramming cmp

如何更改实例的__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)
Run Code Online (Sandbox Code Playgroud)

Kat*_*iel 5

不要这样做

它会使你的代码变得越来越难以维护.困难的原因是因为正确的方法是子类foo:

class FunkyCmpFoo( foo ):
    def __cmp__( self, other ):
        return -1
Run Code Online (Sandbox Code Playgroud)

&c.,&c.这样,你知道所有foo的都以相同的方式FunkyCmpFoo进行比较,并且所有的方式都以相同的方式进行比较.如果你不这样做,你最终会最终将修改版foo与原版进行比较foo,而克苏鲁本人将从深处崛起来惩罚你.

我不确定是否应该这样说,但有可能通过创建自己的实例方法:

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 )
Run Code Online (Sandbox Code Playgroud)

我可以想到一个很好的理由来做这个,那就是你的大敌必须调试代码.事实上,我能想到的一些很有趣的事情记做与(如何你想sys.maxint比较小于全连号?).除此之外,这是一场噩梦.