Python: __setattr__ as class-method // self.__dict__ metaclass 赋值

Python: __setattr__ as class-method // self.__dict__ assignment on a metaclass

我想创建一个简单的 Class,它只将数据存储/保存为 class 属性,而不将实例创建为对象。

简单到可以从我的代码中的任何地方访问:

class DATA:
    foo = {}
    bar = {}

现在我想更进一步,始终将对 foobar 的更改保存在一个文件中,例如搁置,仍然没有创建对象/实例。

我最初的想法是这样的:

class DATA2:
    foo = {}
    bar = {}
    _shelve = False

    def __setattr__(self, name, value):
        if self._shelve is False:
            self.__dict__['_shelve'] = shelve.open('datastorage.shelve')

        self.__dict__['_shelve'][name] = value
        self.__dict__[name] = value

但是 __setattr__ 不能像这样使用 self 参数。 class 实例上似乎没有 __setattr__ 方法。

我的第二种方法是使用元 class,它在后台创建一个 class 实例,将其隐藏在代码中:

class _DATA_MetaClass(type):
    foo = {}
    bar = {}
    _shelve = False

    def __setattr__(self, name, value):
        if self._shelve is False:
            self.__dict__['_shelve'] = shelve.open('datastorage.shelve')

        self.__dict__['_shelve'][name] = value
        self.__dict__[name] = value

class DATA(object):
    __metaclass__ = _DATA_MetaClass

DATA.x = 'val'

这不起作用,它产生:

TypeError: 'dictproxy' object does not support item assignment

这是为什么?

可以使用超class(也就是type)的__setattr__方法来设置自定义属性:

class _DATA_MetaClass(type):
    foo = {}
    bar = {}
    _shelve = False

    def __setattr__(self, name, value):
        if self._shelve is False:
            super(_DATA_MetaClass, self).__setattr__('_shelve', shelve.open('datastorage.shelve'))

        self._shelve[name] = value
        super(_DATA_MetaClass, self).__setattr__(name, value)