programing

클래스 __dict_가 매핑 프록시인 이유는 무엇입니까?

lastmemo 2023. 5. 11. 23:36
반응형

클래스 __dict_가 매핑 프록시인 이유는 무엇입니까?

왜 수업을 하는지 궁금합니다.__dict__이다.mappingproxy단 하나의 예__dict__그냥 평범함dict

>>> class A:
...     pass

>>> a = A()
>>> type(a.__dict__)
<class 'dict'>
>>> type(A.__dict__)
<class 'mappingproxy'>

이렇게 하면 인터프리터가 클래스 수준 속성 및 메서드의 키를 문자열로만 지정할 수 있습니다.

다른 곳에서 Python은 "동의하는 성인 언어"이며, 이는 객체에 대한 딕트가 사용자에 의해 노출되고 변형된다는 것을 의미합니다.그러나 클래스에 대한 클래스 수준 속성 및 메서드의 경우 키가 문자열임을 보장할 수 있다면 클래스 수준에서 속성 및 메서드 조회를 위한 공통 사례 코드를 단순화하고 속도를 높일 수 있습니다.특히, 새로운 스타일 클래스에 대한 __mro__ 검색 로직은 클래스 딕트 키가 문자열이라고 가정하여 단순화되고 속도가 빨라집니다.

매핑 프록시는 단순히 딕트에 해당하지 않습니다.__setattr__방법.

체크아웃 후 이 코드를 참고하시면 됩니다.

from types import MappingProxyType
d={'key': "value"}
m = MappingProxyType(d)
print(type(m)) # <class 'mappingproxy'>

m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment

매핑 프록시는 Python 3.3 이후입니다.다음 코드는 딕트 유형을 보여줍니다.

class C:pass
ci=C()
print(type(C.__dict__)) #<class 'mappingproxy'>
print(type(ci.__dict__)) #<class 'dict'>

Python 3.3 이후mappingproxy유형의 이름이 변경되었습니다.dictproxy이 주제에 대한 흥미로운 토론이 있었습니다.

이 유형에 대한 설명서를 찾는 것은 약간 어렵지만, vars 방법에 대한 설명서는 이를 완벽하게 설명합니다(잠시 동안 문서화되지는 않았지만).

모듈 및 인스턴스와 같은 개체에 업데이트 가능한 항목이 있음__dict__속성; 그러나 다른 개체는 쓰기 제한이 있을 수 있습니다.__dict__속성(예: 클래스에서 유형을 사용함)직접 사전 업데이트를 방지하기 위한 매핑ProxyType).

새 클래스 속성을 할당해야 하는 경우 사용할 수 있습니다.setattr주목할 가치가 있습니다.mappingproxyJSON 시리즈화할 수 없습니다. 문제를 확인하여 이유를 알아보십시오.


또한 이러한 유형의 역사는 매우 흥미롭습니다.

  • 파이썬 2.7: type(A.__dict__)돌아온다<type 'dict'>~하듯이type(dict())다음을 통해 새로운 속성을 할당할 수 있습니다.__dict__,예.A.__dict__['foo'] = 'bar'.
  • Python 3.0 - 3.2: type(A.__dict__)돌아온다<class 'dict_proxy'>차이가 도입되었습니다.새 특성 할당 시도 중 제공되는TypeError다음을 추가하려고 했습니다.dictproxy공공 붙박이 타입으로.
  • Python 3.3: 추가 기능<class 'mappingproxy'>위에서 설명한 유형.

언급URL : https://stackoverflow.com/questions/32720492/why-is-a-class-dict-a-mappingproxy

반응형