将类作为列表索引的魔术方法?

时间:2011-02-12 04:53:53

标签: python

我可以使用布尔值作为列表索引:

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 :(得分:5)

在python中,boolint的子类。这就是为什么你可以使用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