Django 소스 분석 LazySetting 객체
3208 단어 Django
Lazy Setting은 말 그대로 구성 컨텐트를 가져오는 데 지연됩니다.예를 들어 우리는 대상 A를 정의하고 일부 속성을 추가했다. A를 초기화할 때 우리는 A의 속성 값을 비워 두었다. 우리가 A의 속성 중 하나에 접근할 때 속성의 값이 비었을 때 우리는 속성 값을 불러왔다. 그리고 빈 값을 대응하는 값으로 설정하고 속성 값을 되돌려 주었다. 다음에 속성 값을 가져올 때 속성 값이 비지 않고 속성 값을 되돌려 주었다.
왜 Lazy Setting을 사용합니까?
Django 프로젝트를 초기화할 때 Lazy Setting을 통해django가 특정한 설정의 값을 얻기 전에 설정의 값을 특정한 값으로 사용자 정의하고django가 이 설정의 값을 가져올 때 설정이 이미 있으면 이 설정의 값을 직접 되돌려줍니다.
2. Django는 어떻게 Lazy Setting 대상을 실현합니까?
1. LazySetting 대상을 말하기 전에python의 클래스 속성 찾기 방식을 살펴보자.
실례화된 클래스 속성을 찾을 때:
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__기본값을 가져오는 방법입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.