我想創建一個簡單的類,它只是存盤/持有作為類屬性的資料,而不創建作為物件的實體。
簡單來說就是可以從我的代碼中的任何地方進行訪問:
class DATA:
foo = {}
bar = {}
現在我想更進一步,總是把對foo和bar的修改保存在一個檔案中,例如擱置,仍然不創建一個物件/實體。
我最初的想法是這樣的:
class DATA2:
foo = {}
bar = {}
_shelve = False: foo = {} bar = {}.
def __setattr__(self, name, value)。
if self._shelve is False:
self.__dict__['_shelve'] = shelve.open('datastorage.helve')
self.__dict__['_shelve'][name] = value
self.__dict__[name] = value
但是__setattr__不能像這樣使用self引數。而且似乎在一個類的實體上也沒有__setattr__方法。
我的第二個方法是使用一個元類,在后臺創建一個類實體,將其從代碼中隱藏起來:
class _DATA_MetaClass(type) 。
foo = {}
bar = {}
_shelve = False: foo = {} bar = {}.
def __setattr__(self, name, value)。
if self._shelve is False:
self.__dict__['_shelve'] = shelve.open('datastorage.helve')
self.__dict__['_shelve'][name] = value
self.__dict__[name] = value
class DATA(object)。
__metaclass__ = _DATA_MetaClass
DATA.x = 'val': _DATA_MetaClass.
這樣做是不行的,它的結果是:
為什么?
為什么會這樣呢?
uj5u.com熱心網友回復: 你可以使用超類的
標籤:型別錯誤。
TypeError: 'dictproxy' object does not support item assignment__setattr__方法(也就是type)來設定自定義屬性:class _DATA_MetaClass(type) 。
foo = {}
bar = {}
_shelve = False: foo = {} bar = {}.
def __setattr__(self, name, value)。
if self._shelve is False:
super(_DATA_MetaClass, self).__setattr__('_shelve', shelve.open('datastorage.helve')
self._shelve[name] = value
super(_DATA_MetaClass, self).__setattr__(name, value)
