我可以在Python中定义“not”运算符吗?

时间:2013-12-20 16:47:38

标签: python oop operators

我正在尝试连接一个实现逻辑运算符&&,||的C ++库! (一元运算符不)对自定义选择类进行操作。

我有点卡住,因为我在Python中找不到一元'不'运算符。 是否有可能覆盖内置的“”运算符,该运算符在Python中使用布尔值?

是否有其他合适的运算符,或者我是否需要定义函数'Not()'来实现此行为?

3 个答案:

答案 0 :(得分:6)

您无法使用特殊方法挂钩覆盖布尔运算符(andornot),因为and和{{ 1}}懒惰地运行,一个特殊的方法需要你早点评估操作数。

您只能影响对象如何计算为布尔值(使用__nonzero____len__方法,具体取决于您是实现数字还是容器类型; Python 3重命名为{{1}到__bool__)。

可以通过__and____or__连接到按位运算符(or__nonzero__&),然而,__invert__方法。这可能是您正在寻找的。对于|~,还有可用的反向和就地挂钩(__rand____ror____iand____ior__)。

布尔钩子(&等)的结果被强制转换为布尔值(|__nonzero__),但按位运算符钩子可以返回任何你喜欢的东西。 True将评估任何False次返回; ~custom_obj会返回type(custom_obj).__invert__(custom_obj)的结果,除非该方法不存在或返回custom_obj1 & custom_obj2,在这种情况下会调用type(custom_obj1).__and__(custom_obj1, custom_obj2)

答案 1 :(得分:0)

not只对python中的布尔值起作用。如果在您的使用案例中这已足够,您可以覆盖__nonzero__ method。否则,您将无法实施自己的obj.inverted()方法。

答案 2 :(得分:0)

>>> hex(~0xaa & 0xff)
'0x55'

只需使用匹配的Python运算符。