如何让类通过魔法方法作为列表索引?

0 投票
4 回答
758 浏览
提问于 2025-04-16 11:41

我可以用布尔值(真或假)作为列表的索引:

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')

撰写回答