[英]How to clear instance data without setattr?
我想要在python中使可遍历(通过DB,单个文件或仅作为字符串)类。 我写这个(简称):
from json import JSONDecoder, JSONEncoder
def json_decode(object): return JSONDecoder().decode(object)
def json_encode(object): return JSONEncoder().encode(object)
class Storage:
__separator__ = 'ANY OF ANYS'
__keys__ = []
__vals__ = []
__slots__ = ('__keys__', '__vals__', '__separator__')
def __getattr__(self, key):
try:
return self.__vals__[self.__keys__.index(key)]
except IndexError:
raise AttributeError
def __setattr__(self, key, val):
self.__keys__.append(key)
self.__vals__.append(val)
def store(self):
return (json_encode(self.__keys__) + self.__separator__ +
json_encode(self.__vals__))
def restore(self, stored):
stored = stored.split(self.__separator__)
for (key, val) in zip(json_decode(stored[0]), json_decode(stored[1])):
setattr(self, key, val)
是的-可以,但是...当我创建更多实例时,它们都像单例。
那么-如何在没有_ setattr _的情况下将属性设置为实例?
PS。 我有主意-在set / getattr中传递一个key / vals ,但这会弄得一团糟。
您的__separator__
, __keys__
, __vals__
和__slots__
是对象“ Storage”(类对象)的属性。 我不知道它是否完全相同,但是我将其称为类的静态变量。
如果要为每个Storage实例具有不同的值,请在__init__
函数中定义以下每个变量:
class Storage(object):
__slots__ = ('__keys__', '__vals__', '__separator__')
def __init__(self):
super(Storage, self).__setattr__('__separator__', "ANY OF ANYS")
super(Storage, self).__setattr__('__keys__', [])
super(Storage, self).__setattr__('__vals__', [])
def __getattr__(self, key):
try:
vals = getattr(self, '__vals__')
keys = getattr(self, '__keys__')
return vals[keys.index(key)]
except IndexError:
raise AttributeError
def __setattr__(self, key, val):
vals = getattr(self, '__vals__')
keys = getattr(self, '__keys__')
vals.append(val)
keys.append(key)
已编辑,因此getattr和setattr可以工作
2天前我遇到了这个问题。 不知道这是否真的是您的问题,但是您说的是关于“就像我有一个单身汉”
您可以使Storage
类成为特殊基类的子类,如下所示:
class Singleton(object):
def __new__(cls, *args, **kwargs):
if '_inst_' not in vars(cls):
cls._inst = type.__new__(cls, *args, *kwargs)
return cls._inst
class Storage(Singleton):
....
只要您不重写子类中的__new__()
,所有在第一个实例之后创建新实例的后续调用都将返回第一个创建的实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.