编辑布尔值和运算符

时间:2017-12-22 12:37:11

标签: python boolean operators

所以我一直在讨论类中的标准运算符,试着看看我能做些什么,但我还没有找到如何编辑布尔<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project"> <TemplateData> <Name>Service Template</Name> <Description></Description> <ProjectType>CSharp</ProjectType> <ProjectSubType> </ProjectSubType> <SortOrder>1000</SortOrder> <CreateNewFolder>false</CreateNewFolder> <DefaultName>NewService</DefaultName> <ProvideDefaultName>true</ProvideDefaultName> <LocationField>Enabled</LocationField> <EnableLocationBrowseButton>true</EnableLocationBrowseButton> <CreateInPlace>true</CreateInPlace> </TemplateData> 运算符。

我可以通过定义and来编辑按位&运算符,但不能编辑__and__(self)行为的方式。有谁知道我如何改变and a and ba是我所制作类的实例的行为?

提前致谢!

2 个答案:

答案 0 :(得分:5)

在Python 2中,andor访问__nonzero__

>>> class Test(object):
...     def __nonzero__(self):
...         print '__nonzero__ called'
...         return True
... 
>>> Test() and 1
__nonzero__ called
1

在Python 3中,__nonzero__已重命名为__bool__

>>> class Test:
...     def __bool__(self):
...         print('__bool__ called')
...         return True
... 
>>> Test() and 1
__bool__ called
1

请注意,短路评估可能会禁止拨打__nonzero____bool__

>>> 0 and Test()
0
>>> 1 or Test()
1

要注意的另一个特性是,如果__len__ / __nonzero__未定义,Python正在尝试访问__bool__,如果__len__返回一个,则将对象视为真实除0以外的值。如果定义了两种方法,__nonzero__ / __bool__将获胜。

>>> class Test:
...     def __len__(self):
...         return 23
... 
>>> Test() and True
True
>>>
>>> class Test:
...     def __len__(self):
...         return 23
...     def __bool__(self):
...         return False
... 
>>> Test() and True
<__main__.Test object at 0x7fc18b5e26d8> # evaluation stops at Test() because the object is falsy
>>> bool(Test())
False
  

我有什么方法可以让这个回归除了布尔之外的其他东西,比如一个布尔列表?

不幸的是,没有。 documentation表示方法返回FalseTrue,但实际上如果您让其返回其他内容,则会获得TypeError。< / p>

>>> class Test:
...     def __bool__(self):
...         return 1
... 
>>> Test() and 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __bool__ should return bool, returned int
>>> 
>>> bool(Test())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __bool__ should return bool, returned int

答案 1 :(得分:4)

and运算符使用__bool__将第一个操作数转换为布尔值,然后对布尔值执行预定义操作(如果first.__bool__()True,则返回第二个,否则先回来)。没有办法改变这种行为。