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)
它会使你的代码变得越来越难以维护.困难的原因是因为正确的方法是子类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比较小于全连号?).除此之外,这是一场噩梦.