__cmp__方法在Python 2.x中无法正常工作吗?
-
23-09-2019 - |
题
class x:
def __init__(self,name):
self.name=name
def __str__(self):
return self.name
def __cmp__(self,other):
print("cmp method called with self="+str(self)+",other="+str(other))
return self.name==other.name
# return False
instance1=x("hello")
instance2=x("there")
print(instance1==instance2)
print(instance1.name==instance2.name)
这里的输出是:
cmp method called with self=hello,other=there
True
False
这不是我所期望的:我想说的是“如果名称字段相等,则两个实例是平等的”。
如果我只是 return False
来自 __cmp__
功能,此报告为 True
也是!如果我返回 -1
, ,那我得到 False
- 但是,由于我试图比较字符串,所以这感觉不正确。
我在这里做错了什么?
解决方案
__cmp__(x,y)
如果返回负数(例如-1)如果 x < y
, ,一个正数(例如1) x > y
和0如果 x == y
. 。您绝对不应该返回布尔值。
您的超载是 __eq__(x, y)
.
其他提示
这 __cmp__
方法应返回-1、0或1,当自我<其他,self ==其他,self>其他方面。
你可以做
return cmp(self.name, other.name)
在您的代码中以获得适当的结果
你很困惑 __cmp__
和 __eq__
.
如果self <其他,则应返回一个负整数,如果self ==其他,则零,如果是self>其他,则是一个正整数。
__eq__
返回一个布尔值,该布尔人确定两个对象是否相等, __cmp__
返回一个整数,该整数确定两个对象是否比彼此大或少于彼此,除非您有特定 __eq__
, __ne__
, __le__
, __ge__
, __lt__
和 __gt__
方法。
在您的情况下,您确实想要一个 __cmp__
方法而不是 __eq__
因为它可以节省您实施其他5种方法进行其他比较。
您可以使用 cmp()
功能 并将以下内容放入您的 __cmp__
方法:
return cmp(self.name,other.name)
笔记, 正如Ignacio突出的那样 这是 不是Python 3.0中的首选方法, ,但在Python 2.x __cmp__
是要走的路。
Microsoft现在已禁用MicroFeed在网站内容中的视图和“操作”在列表项中等待事件。
解决方法
打开SharePoint Designer
单击所有文件>列表>右键单击已发布的Feed>属性>在设置下从浏览器中的隐藏并保存。 然后返回工作流程,然后选择“等待列表项”的“等待事件”,然后,Microfeab现在应该再次可见。
查找文档 __cmp__
, ,您应该返回一个整数:
如果self <其他,则应返回一个负整数,如果self ==其他,则零,如果是self>其他,则是一个正整数。