不知道这是否可能在Python中,但我想有一个类的实例作为模块级别的全局变量,当调用时返回一个默认属性。
这个想法来自this question,它将覆盖call来让一个类模仿一个函数。
快速(未经测试)的想法的例子:
class _foo(object):
__slots__ = ("_foo",)
_init = False
def __init__(self):
if not _init:
self._foo = ["bar", "baz", "zog"]
def __call__(self, item=None):
if itme is not None:
return self._foo[item]
else:
return self._foo
def __getitem__(self, item):
return self._foo[item]
# Module level
FOO = _foo()
假设上述代码位于模块(foo.py)中。使用解释器,我得到可调用的表单来工作,而不是不可调用的表单。
>>> import foo
# callable forms
>>> foo.FOO(0)
"bar"
>>> foo.FOO()
["bar", "baz", "zog"]
# attribute forms
>>> foo.FOO[2]
"zog"
# doesn't work
>>> foo.FOO
# desired output
>>> foo.FOO
["bar", "baz", "zog"]
我的想法是,我需要以某种方式定义一个默认属性,这样当直接调用实例时,我可以得到我选择的内部列表/字典。我可以通过覆盖repr来欺骗并执行此操作,但这样做违反了Python自己的API,我想避免这种情况。在方括号中传递任何值(>>> foo.FOO[])都会产生语法错误。
我希望任何可能的解决方案至少与Python 2.4兼容,最大为2.7。如果这是不可能的,那么我想我会坚持使用可调用格式。