根据我所研究的,在python中创建类时,大多数操作符和方法都可以被重写。例如使用__add__(self, other)
和其他方法。你知道吗
我的“问题”(更像是我不太明白它是如何完成的)是为了验证我的类中有什么东西我必须使用__contains__(self, theThing)
。
唉,我认为这应该在代码本身中返回一个布尔值,但从我看到的示例代码来看,如下所示:
def __contains__(self, posORname):
return [node.getId() for node in self.tree if node.getId() == posORname or node.getName() == posORname]
因此,我返回的是一个元组,其中包含所述项所在位置的Id。
有人能解释为什么这样做而不是返回True
或False
?如果是这样的话,难道仅仅使用in就不能隐式地获得结构中某个项的索引吗?你知道吗
谢谢:D
根据通常的规则,
__contains__
的结果被转换成布尔值,因此,例如,空列表计为False,而其中包含某些内容的列表计为True。因此,对于您的示例,如果列表中有任何内容—即,任何项目都符合该列表中的条件—那么in
测试将为真。你知道吗这种自动转换为bool的行为似乎没有明确的文档记录,并且与其他操作符(如
<
和>
)不同,后者返回它们返回的内容而不转换为bool。对行为here有一些讨论。你知道吗对于python2 __contains__或python3 __contains__,两者都应返回true或false。现在的问题是什么是真什么是假。Truth value testing。你知道吗
以下值被认为是错误的:
^{} 应返回布尔值。在您的例子中,
__contains__()
返回一个列表,其中包含与posORname
匹配的任何树节点。因此,它基本上只是实现__contains__()
的一种惰性方式,因为在布尔上下文中:False
。你知道吗True
。你知道吗虽然可以让
__contains__()
返回带有匹配树节点的索引或ID的数据结构,in
操作符并不关心;它的存在只是为了检查对象是否包含项。而且,__contains__()
是not intended to be called directly,因此依赖它返回此类信息将是对__contains__()
方法的滥用。你知道吗相反,最好实现一个单独的方法来获取节点的索引/id。你知道吗
相关问题 更多 >
编程相关推荐