Python中的“反向”比较运算符
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python中的“反向”比较运算符,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1790字,纯文字阅读大概需要3分钟。
内容图文
![Python中的“反向”比较运算符](/upload/InfoBanner/zyjiaocheng/694/2a6ab84106e24502bcfa240572ac0eec.jpg)
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中的“反向”比较运算符全部内容,希望文章能够帮你解决Python中的“反向”比较运算符所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。