我可以使用布尔值作为列表索引:
isTrue = True
print ('No','Yes')[isTrue] -> 'Yes'
但如果我定义了一个类,
class YeaOrNay(object):
def __init__(self, val):
self.val = bool(val)
def __nonzero__(self):
return self.val
def __int__(self):
return int(self.val)
def __str__(self):
return ('Nay','Yea')[self.val]
并尝试以相同的方式使用它:
isTrue = YeaOrNay(True)
print ('No','Yes')[isTrue]
我收到错误
TypeError: tuple indices must be integers, not YeaOrNay
我可以解决它,
print ('No','Yes')[int(isTrue)] -> 'Yes'
但是我真的想知道是否有一些魔法类方法可以添加到YeaOrNay中以使其“正常工作”。
答案 0 :(得分:5)
在python中,bool
是int
的子类。这就是为什么你可以使用bool
作为元组的索引。但是,YeaOrNea
显然既不是错误,也不是错误。如果你坚持使用这个对象作为元组的索引,则子类int
(或来欺骗它以使其工作。bool
)
class YeaOrNea(int):
...
否则以正确的方式行事。
print('Yes' if isTrue else 'No')
答案 1 :(得分:1)
简单比复杂更好。
yes_or_no = {True: 'Yeah', False: 'No way'}
print yes_or_no[1==1]
答案 2 :(得分:0)
我相信你正在寻找getitem。这确实使您的代码更难阅读,所以我不建议这样做。
答案 3 :(得分:0)
True = 1且False = 0因此可用于索引
解决9000的评论,这种关系在python 2.6.1中也适用:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> True == 2
False
>>> True == 1
True
>>> False == 1
False
>>> False == 0
True