Python 定义对象何时包含在类中
根据我所研究的,在python中创建类时,大多数操作符和方法都可以被重写。例如,通过使用Python 定义对象何时包含在类中,python,class,overriding,Python,Class,Overriding,根据我所研究的,在python中创建类时,大多数操作符和方法都可以被重写。例如,通过使用\uuuuu添加(self,other)和其他 我的“问题”(更像是我不太明白它是如何完成的)是为了验证我的类中有什么东西,我显然必须使用\uuuuuuuuuuuuuuuuuuu(self,theThing)。 唉,我认为这应该在代码本身中返回一个布尔值,但从我看到的示例代码来看,如下所示: def __contains__(self, posORname): return [node.getId(
\uuuuu添加(self,other)
和其他
我的“问题”(更像是我不太明白它是如何完成的)是为了验证我的类中有什么东西,我显然必须使用\uuuuuuuuuuuuuuuuuuu(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应返回布尔值。在您的例子中,\uuuuuu contains\uuuuu()
正在返回一个列表,其中包含与posORname
匹配的任何树节点。因此,它基本上只是实现\uuuu contains\uuu()
的一种惰性方式,因为在布尔上下文中:
False
True
\uuuu contains\uuuu()
返回带有匹配树节点的索引或ID的数据结构,但中的操作符并不关心;它仅用于检查对象是否包含项。另外,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
相反,您最好实现一个单独的方法来获取节点的索引/id。根据通常的规则将\uuuuu包含的结果转换为布尔值,这样,例如,空列表将计为False,而包含某些内容的列表将计为True。例如,如果列表中有任何内容,也就是说,任何项目都符合列表中的标准,那么
中的测试将为真
这种自动转换为bool的行为似乎没有明确的文档记录,并且与其他操作符(如
)不同,后者返回返回的内容而不转换为bool。对该行为进行了一些讨论。For或两者都应返回true或false。现在的问题是什么是真什么是假
以下值被认为是错误的:
- 没有
- 假的
- 任何数字类型的零,例如0、0.0、0j
- 任何空序列,例如,,(),[]
- 任何空映射,例如,{}
- 用户定义类的实例,如果该类定义了bool()或len()方法,则该方法返回整数零或bool值False
您的目标是确定类是否具有特定属性吗?为什么不尝试调用该属性,然后在它不存在时处理一个AttributeError
异常呢?更确切地说,我使用的是一个树作为抽象数据类型,每个节点都有“n”个子节点,因此不必创建一个函数,如:def mytreeconcains(self,value)我希望能够用一个“in”来调用它,比如:thisttree=Tree(),如果“Harry”在thisttree:print(“Harry在树中”)
一个看起来很奇怪的\uuuu包含的方法<代码>返回any(self.tree中节点的[node.getId()或node.getName()]中的posOrName)
就足够了。一般来说,使用\uuuu contains\uuuu
的上下文只会查看它返回的列表的布尔值(空假,非空真),因此它不是不正确的,但它做的工作远远超出了必要的范围。啊,我明白你的意思了,简而言之,这过于复杂了,它基本上是真的假,谢谢:DThanks:D我想我可能会在类的名称空间中创建一个动态变量,用于存储最近的“contains()”调用的id。谢谢您提供的信息和链接:D