2012-06-12 2 views
1

파이썬에서 (DB, 단일 파일 또는 문자열과 같이) 트래버스 할 수 있도록하고 싶었습니다. 나는이 (단락) 쓰기 :setattr없이 인스턴스 데이터를 지우는 방법은 무엇입니까?

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 _?

추신. 나는 세트/getattr keys/vals에 대한 패스를으로 만들었지 만 엉망이 될 것입니다.

답변

0

__separator__, __keys__, __vals____slots__은 개체 "저장소"(클래스 개체)의 특성입니다. 정확히 같은지는 모르겠지만 클래스의 정적 변수라고 부릅니다. 당신은, 저장의 각 인스턴스에 대해 다른 값을 가지고 당신의 __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 이일 전에. 그게 바로 당신의 문제인지 알고,하지만 당신은

+0

__slots__은 (Google Google) self.xxx가 __setattr__에 의해 구문 분석되므로 해당 내용이 저장되지 않습니다. –

+0

그런 다음 이전과 같이'__slots__'을 남겨 둡니다. 그러나 각 인스턴스 (예를 들어 제가 제안한 것)에서'__keys__'와'__vals__' 둘 다에 다른 []을 설정하지 않으면 모든 인스턴스에서 같은 목록을 공유하게 될 것입니다. – AlbertFerras

+0

시도했습니다. '__getattr__'. 'self .__ key/vals__'을 원할 때, 나는 '__key/vals__'에서'__getattr__' oper를 극대화했습니다. –

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__()을 재정의하지 않으면 첫 번째 인스턴스 이후에 새 인스턴스를 만드는 모든 후속 호출에서 처음 생성 된 인스턴스를 반환합니다.

관련 문제