定义对象何时包含在 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 True
或 False
吗?如果是这样,难道不应该仅通过使用 in 隐含地获取结构中项目的索引吗?
谢谢 :D
__contains__()
应该是 return 一个布尔值。在您的例子中,__contains__()
是 return 一个包含任何匹配 posORname
的树节点的列表。因此,它基本上只是实现 __contains__()
的一种惰性方式,因为在布尔上下文中:
- 空列表等同于
False
。
- 非空列表等同于
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.
根据我的研究,在 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 True
或 False
吗?如果是这样,难道不应该仅通过使用 in 隐含地获取结构中项目的索引吗?
谢谢 :D
__contains__()
应该是 return 一个布尔值。在您的例子中,__contains__()
是 return 一个包含任何匹配 posORname
的树节点的列表。因此,它基本上只是实现 __contains__()
的一种惰性方式,因为在布尔上下文中:
- 空列表等同于
False
。 - 非空列表等同于
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.