所以我一直在讨论类中的标准运算符,试着看看我能做些什么,但我还没有找到如何编辑布尔<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 b
和a
是我所制作类的实例的行为?
提前致谢!
答案 0 :(得分:5)
在Python 2中,and
和or
访问__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表示方法应返回False
或True
,但实际上如果您让其返回其他内容,则会获得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
,则返回第二个,否则先回来)。没有办法改变这种行为。