python - 在Python中定义默认类属性?

标签 python

不确定这在 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
<foo._foo object at 0xdeadbeef>

# desired output
>>> foo.FOO
["bar", "baz", "zog"]



我的想法是,我需要以某种方式定义一个默认属性,以便在直接调用实例时,我可以获得我选择的内部列表/字典。我可以作弊并通过覆盖 repr 来做到这一点,但这有点破坏了 Python 自己的 API,我想避免这种情况。如果在方括号 (>>> foo.FOO[]) 中不传递任何值,则会产生语法错误。

我希望任何潜在的解决方案至少与 Python 2.4 兼容,最多与 Python 2.7 兼容。如果这是不可能的,那么我想我会坚持使用可调用格式。

最佳答案

这是不可能的,抱歉。您不能让 foo.FOO 既是可调用对象(_foo 实例)又是纯粹的列表对象。

当然,我确实说过“纯粹”。如果你感觉偷偷摸摸...

class _foo(list):
    _init = False
    def __init__(self):
        if self._init:
            list.__init__(self)
        else:
            list.__init__(self, ['bar', 'baz', 'zog'])

    def __call__(self, item=None):
        if item is None:
            return self
        return self[item]

FOO = _foo()

用法:

>>> FOO()
['bar', 'baz', 'zog']
>>> FOO(0)
'bar'
>>> FOO
['bar', 'baz', 'zog']

关于python - 在Python中定义默认类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468855/

相关文章:

python - Kivy,面具小部件 Canvas

python - Sagemaker-其他端点

Python:如何从字符串中删除数字周围的引号

python - 如何删除可变长度字符串的一部分

python - 如何从数据框中获取最大值?

python - panda groupby agg 和计算函数一起

python - 不同大小集合中元素的所有可能组合

python - groupby 中的 Pandas 加权模式

python - 使用 Swig 在成员中使用互斥锁包装 C++ 类时出现问题

python - 你能导入一个 .so 文件吗?