我创建了一个包装值的类,以便我可以将其作为列表或普通值进行访问。但是,我只能将值表示为字符串或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:
这样做的目的是让我不必在其他地方使用重构代码,可能将选项称为值而不是列表。可重复选项的引入在所有选项中引入了列表,因此需要一个包装器来允许访问值而无需将其作为列表访问。
答案 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破坏与实现访问列表类型的显式方法之间的妥协。