我正在尝试连接一个实现逻辑运算符&&,||的C ++库! (一元运算符不)对自定义选择类进行操作。
我有点卡住,因为我在Python中找不到一元'不'运算符。 是否有可能覆盖内置的“不”运算符,该运算符在Python中使用布尔值?
是否有其他合适的运算符,或者我是否需要定义函数'Not()'来实现此行为?
答案 0 :(得分:6)
您无法使用特殊方法挂钩覆盖布尔运算符(and
,or
和not
),因为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运算符。