A = {
Foo': 1,
바': 2
}
A.foo 를 인쇄합니다
A.bar 인쇄
Setattr 및 __getattr__ 의 사용
다음 코드를 보십시오.
# 인코딩: UTF-8
클래스 테스트 (객체):
Def __init__(self):
Self.a = 1
Self.b = 2
# 설정 속성이 호출됩니다.
Def __setattr__(self, key, value):
인쇄' __setattr__: %s'% 키
자아. _ _ dict _ _ [키] = 값
# __getattr__ 존재하지 않는 멤버에 액세스할 때만 호출됩니다.
Def __getattr__(self, 키):
인쇄' __getattr__: %s'% 키
자아로 돌아가다. _ _ dict _ _ [키]
If __name__ == '__main__':
T = 테스트 ()
인쇄 일정
인쇄 일정
T.c = 12
인쇄 온도 제어
T.c = 13
T.a = 123
인쇄 시간
Setattr 는 속성이 설정될 때마다 호출되고 __getattr 는 존재하지 않는 요소에 액세스할 때만 호출됩니다.
객체의 등록 정보는 다음 위치에 저장됩니다
사전은 이 사전에 있다. 기본
Setattr 및
Getattr__ 도 이 사전에 액세스합니다.
클래스를 저장하는 래퍼를 통해 사전에 액세스합니다.
#! /usr/bin/env 파이썬
# 인코딩: utf8
Json 가져오기
범주 저장소 (사전):
Def __init__(self, *args, **kw):
딕. __init__(self, *args, **kw)
Def __getattr__(self, 키):
본인에게 돌아가기 [키]
Def __setattr__(self, key, value):
Self [키] = 값
Def __delattr__(self, 키):
Delself [키]
If __name__ == '__main__':
L = {'foo': 'bar'}
S = 저장 용량 (리터)
S.foo 를 인쇄합니다
S['foo'] 인쇄
스토리지클래스 캡슐화를 통해 아래 첨자 s['foo'] 뿐만 아니라 s.foo 를 사용하여 foo 의 해당 요소를 호출할 수 있음을 알 수 있습니다.
원리는 매우 간단하다. 기본 __getattr 및 을 (를) 변경했습니다.
Setattr 구현, 기본 구현은 내부에 액세스하는 것입니다.
Dict__, encounter 는 기본 클래스인 Dict 에 액세스하므로 s.foo 에 액세스할 때 내부 dict['foo'] 에 액세스하여 요소에 액세스할 수 있습니다.
Json 라이브러리 로드에서 object_hook 매개 변수 사용
아래 코드를 보세요. 전통적인 JSON 직렬화 및 deserialize 는 다음과 같습니다.
Json 가져오기
십진수에서 가져오기 *
Obj = {'name':' 하하',' 나이': 23,' 키': 1.75}
Json_string = json.dumps(obj)
Json_string 을 인쇄합니다
새 객체 = json.loads(json_string)
새 객체 플롯
위에서 볼 수 있듯이 dict 는 패키지화 후 스토리지로 변환되어 속성에 액세스하여 요소에 액세스할 수 있습니다. Json 의 loads 함수도 비슷한 기능을 제공합니다.
# 인코딩: UTF-8
Json 가져오기
Obj = {'name':' 하하',' 나이': 23,' 키': 1.75}
Json_string = json.dumps(obj)
컬렉션에서 명명된 튜플을 가져옵니다
Student = namedtuple('Student', ['name',' age',' height'])
Def object_hook_handler (사전 _ 개체):
학생 반환 (name=dict_obj['name'],
Age=dict_obj['age'],
Height=dict_obj['height'])
로드 (json_string, object _ hook = object _ hook _ handler)
새 객체 플롯
인쇄 결과는 다음과 같습니다.
학생 (이름 =u' 하하', 나이 =23, 키 = 1.75)
보시다시피 함수는 object_hook 매개 변수를 통해 전달되며 dict 를 명명된 튜플로 변환합니다.
사실 파이썬에서는 클래스도 함수로 볼 수 있으므로 클래스 이름을 인수로 전달하면 됩니다.
세트에서 직접 주문 임포트
New_obj = json.loads(json_string, object_hook=OrderedDict)
새 객체 플롯
결과는 다음과 같습니다.
OrderedDict([(u'age', 23), (u'name', u'haha'), (u'height',/kloc-;
스토리지를 숨깁니다
사용하기 쉽도록 사용자가 스토리지에 닿지 않도록 다음과 같이 쓸 수 있습니다.
#! /usr/bin/env 파이썬
# 인코딩: utf8
Json 가져오기
범주 저장소 (사전):
Def __init__(self, *args, **kw):
딕. __init__(self, *args, **kw)
Def __getattr__(self, 키):
본인에게 돌아가기 [키]
Def __setattr__(self, key, value):
Self [키] = 값
Def __delattr__(self, 키):
Delself [키]
Dct (저장 객체 후크) 를 정의하려면 다음과 같이 하십시오.
스토리지 (DCT) 로 돌아가기
Def json_decode(data, *args, **kw):
Json.loads(data, object _ hook = storage _ object _ hook, *args, **kw) 를 반환합니다
Def json_encode(data, *args, **kw):
Json.dumps(data, *args, **kw) 를 반환합니다
If __name__ == '__main__':
L = {'foo': 'bar'}
L = json_decode(json_encode(l))
L 인쇄
L.foo 를 인쇄합니다