python - 我如何更改实例的 __cmp__ 函数(不在类里面)?

标签 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)

最佳答案

不要这样做

这会使您的代码出现错误并且难以维护。之所以困难是因为正确的方法是继承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/

相关文章:

python - 在功能 'error'/root/torch/install/share/lua/5.1/trepl/init.lua :389: in function 'require'

python - <head> 中的 lxml 和 <noscript>

python - 为什么在 Python3.0 中将 cmp 参数从 sort/sorted 中删除?

Bash,如何在使用 cmp 时打印出相同的文件

performance - x86 "cmp"指令的奇怪行为

python - Pandas for Python 中的 Winsorize 数据

python - pygame 模块 'pygame.event.get()' 不适用于方法吗?

c++ - 类型和非类型模板特化

c++ - 编译错误:使用 constexpr 声明 std::array 大小

c++ - 我应该如何将 C++ 元程序与 C 代码进行比较? (运行 )