gpt4 book ai didi

Python:__setattr__ 作为类方法//self.__dict__ 对元类的赋值

转载 作者:行者123 更新时间:2023-12-04 17:15:09 25 4
gpt4 key购买 nike

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

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

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' 对象不支持项目分配

这是为什么?

最佳答案

您可以使用父类(super 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)

关于Python:__setattr__ 作为类方法//self.__dict__ 对元类的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68858059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com