如何在未作为列表访问时返回本机对象值

时间:2013-10-12 10:18:07

标签: python

我创建了一个包装值的类,以便我可以将其作为列表或普通值进行访问。但是,我只能将值表示为字符串或int而不是其本机类型。有更好的方法吗?

class Options(object):
    default_option = None

class Option(object):
    def __init__(self, name, value):
        self.name = name
        if isinstance(value, list):
            self.value = [] + value
        else:
            self.value = [ value ]

    def __str__(self): return self.value[-1]
    def __long__(self): return self.value[-1]
    def __int__(self): return self.value[-1]
    def __float__(self): return self.value[-1]        
    def __getitem__(self, index): return self.value[index]

setattr(Options, 'opt', Option('opt', None))
print Options.opt

产生输出:

'None'

但我不能进行这种比较:

if Options.opt is None:

虽然这确实有效:

if Options.opt[0] is None:

if Options.opt != "some value":

if Options.opt == 1:

这样做的目的是让我不必在其他地方使用重构代码,可能将选项称为值而不是列表。可重复选项的引入在所有选项中引入了列表,因此需要一个包装器来允许访问值而无需将其作为列表访问。

1 个答案:

答案 0 :(得分:0)

似乎无法覆盖is运算符,此更改将破坏现有的API调用。我将改为实现以下内容,它在实现对Options类的新API调用时维护现有API,以获取list类型选项。

class ListOptions(object):
    pass

class Options(object):
    @classmethod
    def list(cls):
        return ListOptions

    @classmethod
    def __setattr__(cls, name, value):
        if instance(value, list):
            value = [] + value
        else:
            value = [ value ]
        object.__setattr__(cls, name, value[-1])
        setattr(ListOptions, name, value)

setattr(Options, 'opt', Option('opt', None))

现在,它一如既往地工作,从列表中返回最后一项(如果不是列表类型,则返回唯一项目):

if Options.opt is None:

而且,我可以通过list accesser方法访问新的list类型,如下所示:

if Options.list().opt[0] is None:

if Options.list().opt != "some value":

if Options.list().opt == 1:

或者,通过ListOptions类:

if ListOptions.opt[0] is None:

if ListOptions.opt != "some value":

if ListOptions.opt == 1:

我认为这是API破坏与实现访问列表类型的显式方法之间的妥协。