gpt4 book ai didi

python - 如果在 Python 中进行鸭式打字,你应该测试 isinstance 吗?

转载 作者:IT老高 更新时间:2023-10-28 21:11:36 26 4
gpt4 key购买 nike

你有一个 Python 类,它需要一个 equals 测试。 Python 应该使用鸭子类型(duck typing),但是在 eq 函数中包含或排除 isinstance 测试是否(更好/更准确)?例如:

class Trout(object):
def __init__(self, value):
self.value = value

def __eq__(self, other):
return isinstance(other, Trout) and self.value == other.value

最佳答案

__eq__ 方法中使用 isinstance 很常见。这样做的原因是,如果 __eq__ 方法失败,它可以回退到另一个对象的 __eq__ 方法。大多数普通方法都是显式调用的,但 __eq__ 是隐式调用的,因此它需要更频繁地查看前跳。

编辑(感谢 Sven Marnach 的提醒):

要使其回退,您可以返回 NotImplemented 单例,如下例所示:

class Trout(object):
def __init__(self, value):
self.value = value

def __eq__(self, other):
if isinstance(other, Trout):
return self.value == other.value
else:
return NotImplemented

假设一个 RainbowTrout 知道如何将自己与一个 Trout 或另一个 RainbowTrout 进行比较,但是一个 Trout只知道如何将自己与 Trout 进行比较。在这个例子中,如果你测试 mytrout == myrainbowtrout,Python 会先调用 mytrout.__eq__(myrainbowtrout),注意到它失败了,然后调用 myrainbowtrout。 __eq__(mytrout),成功了。

关于python - 如果在 Python 中进行鸭式打字,你应该测试 isinstance 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com