如何让类通过魔法方法作为列表索引?
我可以用布尔值(真或假)作为列表的索引:
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类上,让它“正常工作”。
4 个回答
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
1
简单比复杂好。
yes_or_no = {True: 'Yeah', False: 'No way'}
print yes_or_no[1==1]
5
在Python中,bool
(布尔值)其实是int
(整数)的一个子类。这就是为什么你可以用bool
作为元组的索引。不过,YeaOrNea
显然既不是布尔值也不是整数,所以会出现错误。如果你非要把这个对象当作元组的索引用,那就需要让它继承int
(或者bool
),这样才能让它正常工作。
class YeaOrNea(int):
...
否则就按照正确的方法来做。
print('Yes' if isTrue else 'No')