1

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 でkeys/valsのパスを作成しますが、混乱します。

4

2 に答える 2

0

your __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日前にその問題が発生しました。それがまさにあなたの問題かどうかはわかりませんが、「私はシングルトンを持っているようです」と言いました

于 2012-06-12T20:57:08.857 に答える
0

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__()、最初のインスタンスの後に新しいインスタンスを作成するための後続の呼び出しはすべて、最初に作成されたインスタンスを返します。

于 2012-06-12T21:33:47.510 に答える