【问题标题】:Python: __setattr__ as class-method // self.__dict__ assignment on a metaclassPython: __setattr__ as class-method // self.__dict__ 在元类上赋值
【发布时间】:2021-08-20 06:53:47
【问题描述】:

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

就像在我的代码中可以从任何地方访问一样简单:

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 参数来使用。而且在类实例上似乎没有__setattr__ 方法。

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

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

这是为什么呢?

【问题讨论】:

    标签: python python-2.7 object setattr


    【解决方案1】:

    可以使用超类(即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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多