标签:python comparison
class Inner():
def __init__(self, x):
self.x = x
def __eq__(self, other):
if isinstance(other, Inner):
return self.x == other.x
else:
raise TypeError("Incorrect type to compare")
class Outer():
def __init__(self, y):
self.y = Inner(y)
def __eq__(self, other):
if isinstance(other, Outer):
return self.y == other.y
elif isinstance(other, Inner):
return self.y == other
else:
raise TypeError("Incorrect type to compare")
if __name__ == "__main__":
a = Outer(1)
b = Inner(1)
print(a == b) # ok no problem
print(b == a) # This will raise a type error
在示例中,我有内部和外部类.我无法控制Inner只是想模拟这种情况的工具.我只能控制外层的行为.我希望外部实例能够与内部实例进行比较(不仅仅是相等).在给定的实现中,只有第一个比较有效,因为调用了Outer的__eq__方法可以与Outer和Inner实例进行比较,但是第二个调用了Inner的__eq__却不允许与Outer进行比较-哎呀,它不知道Outer存在为什么要麻烦执行它.
有没有一种方法可以使第二种类型的比较工作,例如__radd__之类的功能.
我知道例如在C中,您可以使用内联运算符定义解决此问题,但Python中没有这种定义.
解决方法:
不要对它说得太过分:Inner .__ eq__坏了.至少,应该抛出return NotImplemented
而不是抛出错误,这将允许Python尝试进行反向比较:
When
NotImplemented
is returned, the interpreter will then try the
reflected operation on the other type, or some other fallback,
depending on the operator. If all attempted operations return
NotImplemented
, the interpreter will raise an appropriate exception.
更好的是,它将使用“duck typing”,而不是坚持使用特定的类(除非该类而不是其接口是比较的显着重要部分):
def __eq__(self, other):
try:
return self.x == other.x
except AttributeError:
return NotImplemented
但是,正如您所说无法控制的那样,您将必须手动实现类似的功能,例如:
def compare(a, b):
"""'Safe' comparison between two objects."""
try:
return a == b
except TypeError:
return b == a
因为在Python’s data model中没有__req__这样的东西.
标签:python,comparison 来源: https://codeday.me/bug/20191010/1888304.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。