객체의 __dict__를 수정하여 속성을 Pythonic으로 간주합니까?


12

데이터베이스 (또는 MongoDB, CSV 파일 등의 다른 소스)에서 찾은 행의 객체를 팽창시키는 클래스가 있습니다. 객체의 속성을 설정하기 위해 self.__dict__.update(**properties)또는 과 같은 작업을 수행 obj.__dict__.update(**properties)합니다.

이것이 파이썬으로 간주됩니까? 이것이 계속 사용해야하는 좋은 패턴입니까, 아니면 잘못된 형태로 간주됩니까?


1
나는 그것이 Pythonic인지는 모르겠지만 dunder init에서하는 것이 더 일반적입니다.
user16764

답변:


10

Python 3.3에서는 새로운 유형이 추가 types.SimpleNamespace()되었으며 설명서에서 다음과 같이 설명됩니다.

형식은 다음 코드와 대략 동일합니다.

class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

__init__유형 의 방법에 유의하십시오 . 파이썬 문서보다 기술을 더 잘 보증 할 수는 없습니다.


비록 SimpleNamespace이 속성의 고정 세트가없는에서 것을 대부분의 종류는 매우 다르다.

7
자, docs.python.org/2/library/stdtypes.html 의 파이썬 문서에 대해 "모든 모듈의 특별한 속성은입니다 __dict__. 이것은 모듈의 심볼 테이블을 포함하는 사전입니다.이 사전을 수정하면 실제로 모듈의 심볼이 변경됩니다. 표는하지만, 직접 할당 __dict__속성은 불가능하다 (당신이 쓸 수있는 m.__dict__['a'] = 1정의하는 m.a일 수 있지만, 당신은 할 수 없습니다 writem.__dict__ = {}). 수정이 __dict__직접 사용하지 않는 것이 좋습니다 "처음이 질문을 나에게 묻는 메시지가 바로 이것이다.
skyler

@skyler : 모듈 네임 스페이스 만 언급합니다 . 이 globals()함수는 동일한 네임 스페이스를 반환하며 일반적으로 전역을 동적으로 설정하는 것보다 문제를 해결하는 더 좋은 방법이 있으므로 경고가 발생합니다.
Martijn Pieters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.