赞
踩
当某对象作为if 分支的主角时
if exp:
,解释器会对其进行真值测试,即bool(exp)
,对于不同类型,计算布尔值都有着不同的规则,例如对于整型变量,为0代表False,对于列表,空列表代表False等。现将规则统计如下:
(1)False:None,0,False,[],(),{},set(),frozenset()等
(2)True:非0数值,True,非空的容器类型,用户自定义的类和实例
对于用户自定义的类或实例,默认调用bool方法时为True,可通过重写类的_bool_方法,以更改bool()方法的逻辑。类似方法同样适用于更改len()函数获的逻辑。
class A: def __init__(self,data): self.data=data def __len__(self): return len(self.data) class B: def __init__(self,data): self.data=data def __len__(self): return 100 def __bool__(self): return False nums=[1,2,3,4,5] a=A(nums) b=B(nums) print(len(a),bool(a))#5 True print(len(b),bool(b))#100 False,通过自定义__bool__与__len__,强制修改了逻辑,返回自定义值。
-------------------------------------------------------------------------------------------------
上面提到对于
len(x)
与bool(x)
可通过类内函数__bool__
与__len__
重载,以自定义逻辑。同样,对于运算符==
也可以使用类内函数__eq__
进行重载,例如无论什么情况都强制返回相等。
class A:
def __init__(self,str):
self.str=str
def __eq__(self, other):
"""
:param other: 表示==运算符右边的变量,如x==y,调用x对象的__eq__函数,此时other参数就是y
:return:
"""
return True
a=A("str")
print(type(a),a==3.14)#<class '__main__.A'> True,可见a与3.14的类型都不一致,但仍强制返回了True
因此由于
==
运算符可以被重载,其正确性就难以保证。相对于==
,is
运算符更为可靠。
(1)==对比值是否相等,可以被__eq__
重载。
(2)is对比内存地址是否相等,不可被重载。
(1)all(iterable)—当可迭代对象的所有成员布尔值都为True,才返回True
(2)any(iterable)—当可迭代对象的存在成员布尔值为True,就返回True
and优先级高于or
“短路求值”特性:a or b or c or d...
只会返回这些变量里第一个为True的
对象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。