在Python中覆盖不是运算符

时间:2016-09-28 18:13:45

标签: python operator-overloading operators

我找不到与not x运算符对应的方法。有一个and,or,xor tho。它在哪里? https://docs.python.org/3/reference/datamodel.html

2 个答案:

答案 0 :(得分:7)

andor运算符没有挂钩,没有(因为它们短路),并且Python中没有xor运算符。 __and____or__分别用于bitwise & and | operatorsnot的等效按位运算符为~(反转),由__invert__ method处理,而__xor__覆盖^按位运算符。

nottruth-value of an object进行操作。如果您有容器,请给它__len__ method,如果没有给它__bool__ method。咨询任何一方以确定是否应该考虑对象' true&#39 ;; not会反转该测试的结果。

因此,如果__bool__返回True__len__返回0以外的整数,not会将其反转为False,否则{ {1}}生成not。请注意,除了布尔值之外,您无法使True返回任何其他内容!

来自not的文档:

  

__bool__
  被称为实施真值测试和内置操作__bool__;应该返回bool()False。如果未定义此方法,则调用True(如果已定义),如果对象的结果非零,则认为该对象为true。如果某个类既未定义__len__()也未定义__len__(),则其所有实例都被视为true。>

not expression

  

在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false:__bool__()False,所有类型的数字零和空字符串和容器(包括字符串,元组,列表,字典,集合和frozensets)。所有其他值都被解释为true。 用户定义的对象可以通过提供None方法来自定义其真值。

     

如果参数为假,则__bool__()运算符not,否则为True

大胆强调我的

答案 1 :(得分:3)

  

and,or,xor tho

您正在查看的方法是按位 &|^,而不是and,{{1} },或or(甚至不是Python运算符)。

xor无法重载,就像notand无法重载一样。但是,按位or可能会过载;这是~

如果您希望自己可以超载__invert__,那么您将不得不替代重载not,或者您必须编写自己的~ logical_not 1}}功能并使用它而不是not运算符。