사전의 객체에 액세스하는 데 사용할 수 있는 것은 무엇입니까?

파이썬에서는 사전의 모든 요소가 아래 첨자를 통해 액세스되지만 어떤 면에서는 멤버 변수에 액세스하는 것처럼 사전에 액세스할 수 있습니다.

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 를 인쇄합니다