定义对象何时包含在 class

Defining when an object is contained in a class

根据我的研究,在 python 中创建 class 时,大多数运算符和方法都可以被覆盖。例如,通过使用 __add__(self, other) 和其他。

我的"problem"(更像是我不太明白它是如何完成的)是为了验证我的class中是否有东西我显然必须使用__contains__(self, theThing)。 唉,我认为这应该 return 代码本身的布尔值,但从我看到的示例代码来看,像这样:

def __contains__(self, posORname):
     return [node.getId() for node in self.tree if node.getId() == posORname or node.getName() == posORname]

因此,我 returning 是一个包含所述项目所在位置的 Id 的元组。 有人可以解释为什么这样做而不是 returning TrueFalse 吗?如果是这样,难道不应该仅通过使用 in 隐含地获取结构中项目的索引吗?

谢谢 :D

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

  1. 空列表等同于 False
  2. 非空列表等同于True.

虽然您可能拥有 __contains__() return 具有匹配树节点的索引或 ID 的数据结构,但 in 运算符并不关心;它的存在只是为了检查一个项目是否包含在一个对象中。此外,__contains__()not intended to be called directly,因此依赖它来 return 这样的信息将是对 __contains__() 方法的滥用。

相反,您最好实现一个单独的方法来获取节点的 index/id。

__contains__ 的结果根据通常的规则转换为布尔值,例如,空列表算作 False,而包含某些内容的列表算作 True。因此,对于您的示例,如果列表中包含任何内容——也就是说,任何项目都符合该列表理解中的标准——那么 in 测试将为真。

这种自动转换为 bool 的行为似乎没有明确记录,并且与其他运算符(如 <>)不同,return 什么他们 return 没有转换为 bool。有一些关于 here.

行为的讨论

对于 python2 __contains__ or python3 __contains__ both should return true or false. And now the question is what is True and what is False. Truth value testing

以下值被认为是错误的:

  • None
  • 错误
  • 任何数字类型的零,例如 0、0.0、0j。
  • 任何空序列,例如,'', (), [].
  • 任何空映射,例如 {}。
  • 用户定义的classes的实例,如果class定义了一个bool()或len() 方法,当该方法 returns 整数零或布尔值 False.