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 = {}
现在我想更进一步,始终将对 foo
和 bar
的更改保存在一个文件中,例如搁置,仍然没有创建对象/实例。
我最初的想法是这样的:
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)
我想创建一个简单的 Class,它只将数据存储/保存为 class 属性,而不将实例创建为对象。
简单到可以从我的代码中的任何地方访问:
class DATA:
foo = {}
bar = {}
现在我想更进一步,始终将对 foo
和 bar
的更改保存在一个文件中,例如搁置,仍然没有创建对象/实例。
我最初的想法是这样的:
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)