Django 소스 분석 LazySetting 객체

3208 단어 Django
1. Django에서 LazySetting 대상을 통해 프로젝트의 설정을 얻습니다. LazySetting 대상은 어떤 특성을 가지고 있습니까?왜 이 대상을 사용합니까?
Lazy Setting은 말 그대로 구성 컨텐트를 가져오는 데 지연됩니다.예를 들어 우리는 대상 A를 정의하고 일부 속성을 추가했다. A를 초기화할 때 우리는 A의 속성 값을 비워 두었다. 우리가 A의 속성 중 하나에 접근할 때 속성의 값이 비었을 때 우리는 속성 값을 불러왔다. 그리고 빈 값을 대응하는 값으로 설정하고 속성 값을 되돌려 주었다. 다음에 속성 값을 가져올 때 속성 값이 비지 않고 속성 값을 되돌려 주었다.
왜 Lazy Setting을 사용합니까? 
Django 프로젝트를 초기화할 때 Lazy Setting을 통해django가 특정한 설정의 값을 얻기 전에 설정의 값을 특정한 값으로 사용자 정의하고django가 이 설정의 값을 가져올 때 설정이 이미 있으면 이 설정의 값을 직접 되돌려줍니다.
2. Django는 어떻게 Lazy Setting 대상을 실현합니까?
1. LazySetting 대상을 말하기 전에python의 클래스 속성 찾기 방식을 살펴보자.
실례화된 클래스 속성을 찾을 때:
  • 우선 이 종류의 실례 속성이 존재하는지 확인하고 직접 되돌아오기
  • 클래스의 실례 속성에 존재하지 않으면 클래스의 클래스 속성에서 찾고 클래스 속성에 존재하면 되돌아오기
  • 클래스 속성에도 존재하지 않는 경우 을 정의한 경우getattr__방법은 에 따른다getattr__메소드 획득 속성
  • python에서 클래스 속성과 실례 속성은 클래스의 내장 변수에 기록됩니다dict__에서 클래스 속성과 인스턴스 속성은 각각 유지 관리되는dict__
    class A:
        a = '   '
    
        def __init__(self):
            self.a = '    '
    
    
    print(A.__dict__)
    print(A().__dict__)

    결과 출력:
    {
        "__module__": "__main__",
        "a": "   ",
        "__init__": < function A.__init__ at 0x04BBAB28 >,
        "__dict__": < attribute "__dict__" of "A" objects >,
        "__weakref__": < attribute "__weakref__" of "A" objects >,
        "__doc__": None
    }
    
    {
        "a": "    "
    }

    주의해야 할 것은 클래스 속성 안에 a속성만 있는 것이 아니라 다른 클래스와 관련된 속성도 있다
    우리는 클래스 속성 안의 a의 값과 실례 속성 안의 a의 값이 다르다는 것을 볼 수 있다.클래스 속성과 실례 속성은 각각 유지보수됩니다.
    2. 다음은 실례화된 클래스 검색 속성의 예를 몇 개 쓰겠습니다.
    첫 번째 예:
    class A:
        a = 'Aa'
        b = 'Bb'
    
    
    class A:
        a = 'Aa'
        b = 'Bb'
    
        def __init__(self):
            self.a = 'aa'
    
    
    obj = A()
    print(obj.a)
    print(obj.b)
    def __init__(self):
            self.a = 'aa'
    
    obj = A()
    print(obj.a)
    print(obj.b)

    출력의 결과는(먼저 실례 속성에서 찾고, 찾지 못하고, 클래스 속성에서 찾기)
    aa
    Bb

    만약 우리 print(obj.c)가 틀렸다면, 클래스 속성과 실례 속성에서 c를 찾을 수 없기 때문에 오류가 발생할 것입니다
    두 번째 예:
    class A:
        a = 'Aa'
        b = 'Bb'
    
        def __init__(self):
            self.a = 'aa'
    
        def __getattr__(self, item):
            return 'cc'
    
    obj = A()
    print(obj.a)
    print(obj.b)
    print(obj.c)

    출력의 결과는 위와 유사하지만 print(obj.c)는 틀리지 않습니다. 을 정의했기 때문입니다.getattr__방법, 실례 속성과 클래스 속성에서 찾을 수 없을 때 이 방법으로 속성을 획득합니다
    aa
    Bb
    cc

    3. Django의 Lazy Setting 유형의 실현
    LazySetting 클래스의 실현은 정의를 통해getattr__방법이 실현된 Lazy Setting 클래스의getattr__소스 코드는 다음과 같습니다.
    def __getattr__(self, name):
        """Return the value of a setting and cache it in self.__dict__."""
    
        if self._wrapped is empty:
            self._setup(name)
    
        val = getattr(self._wrapped, name)
        self.__dict__[name] = val
    
        return val

    Lazysetting 대상에서 속성을 찾을 때 실례 속성 (self. dict)에서 찾을 수 없습니다.getattr__방식 획득, 획득 후 속성 값을 실례 속성에 저장하면 속성이 사용될 때
    다시 가져오고 저장합니다.우리는 속성을 얻기 전에 속성의 값을 사용자 정의해서 을 사용하지 않아도 된다getattr__기본값을 가져오는 방법입니다.

    좋은 웹페이지 즐겨찾기