定义对象何时包含在类中

2024-05-19 05:07:18 发布

您现在位置:Python中文网/ 问答频道 /正文

根据我所研究的,在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。 有人能解释为什么这样做而不是返回TrueFalse?如果是这样的话,难道仅仅使用in就不能隐式地获得结构中某个项的索引吗?你知道吗

谢谢:D


Tags: 方法代码inselfaddnode示例for
3条回答

根据通常的规则,__contains__的结果被转换成布尔值,因此,例如,空列表计为False,而其中包含某些内容的列表计为True。因此,对于您的示例,如果列表中有任何内容—即,任何项目都符合该列表中的条件—那么in测试将为真。你知道吗

这种自动转换为bool的行为似乎没有明确的文档记录,并且与其他操作符(如<>)不同,后者返回它们返回的内容而不转换为bool。对行为here有一些讨论。你知道吗

对于python2 __contains__python3 __contains__,两者都应返回true或false。现在的问题是什么是真什么是假。Truth value testing。你知道吗

以下值被认为是错误的:

  • 没有
  • 任何数字类型的零,例如0、0.0、0j
  • 任何空序列,例如,,(),[]。你知道吗
  • 任何空映射,例如{}。你知道吗
  • 用户定义类的实例,如果该类定义了bool()或len()方法,则该方法返回整数0或bool值False。你知道吗

^{}应返回布尔值。在您的例子中,__contains__()返回一个列表,其中包含与posORname匹配的任何树节点。因此,它基本上只是实现__contains__()的一种惰性方式,因为在布尔上下文中:

  1. 空列表相当于False。你知道吗
  2. 非空列表相当于True。你知道吗

虽然可以让__contains__()返回带有匹配树节点的索引或ID的数据结构,in操作符并不关心;它的存在只是为了检查对象是否包含项。而且,__contains__()not intended to be called directly,因此依赖它返回此类信息将是对__contains__()方法的滥用。你知道吗

相反,最好实现一个单独的方法来获取节点的索引/id。你知道吗

相关问题 更多 >

    热门问题