"__init__()" 및 "__new__()": 순서 및 목적
"__init__()" 및 "__new__()" 인스턴스 생성을 제어하고 초기화.
"__new__()"는 메모리 할당과 클래스의 새 인스턴스 생성, 새로 생성된 객체 반환을 담당합니다. 실제 인스턴스 생성을 담당합니다.
반대로 "__init__()"는 새로 생성된 인스턴스를 초기화합니다. 인스턴스의 속성을 설정하고 사용할 객체를 준비하는 데 필요한 작업을 수행하는 일을 담당합니다.
Python의 설계에 따르면 인스턴스 생성 프로세스에서 "__init__()"는 항상 "__new__()" 다음에 호출됩니다. . 새 인스턴스가 생성된 후 초기화해야 하기 때문입니다.
Flyweight 패턴 및 "__init__()" 호출
Flyweight 패턴의 맥락에서 , "__new__()" 다음에 호출되는 "__init__()"의 예상 동작에 대해 혼란스러울 수 있습니다. 이는 Flyweight 패턴이 일반적으로 "__new__()"를 활용하여 인스턴스 생성을 제어하고 동일한 개체의 여러 복사본 생성을 방지하기 때문입니다.
예제 코드에서 사용자 정의 "__new__()" 메서드를 구현하여 사전에 있는 키의 존재를 기반으로 인스턴스 생성을 처리합니다. 그러나 Flyweight 패턴을 사용하여 생성된 후속 인스턴스에 대해서도 "__init__()" 메서드가 한 번만 호출되도록 의도했을 수도 있습니다.
"__init__()"가 "" 이후에 항상 호출되는 이유는 무엇입니까? __new__()"?
이 동작의 이유는 Python의 객체 지향 시스템이 생성된 모든 인스턴스가 다음을 통해 초기화될 것으로 기대하기 때문입니다. "__init__()"를 호출합니다. 이는 인스턴스 생성 프로세스의 기본 부분으로, 개체가 사용할 수 있도록 완전히 준비되었는지 확인합니다.
대체 구현
Flyweight 패턴을 구현하고 " __init__()"를 여러 번 사용하는 경우 "__new__()"를 재정의하는 대신 팩토리 클래스를 사용해야 합니다. 이는 보다 강력하고 표준적인 접근 방식으로 간주됩니다.
다음은 팩토리 기반 Flyweight 구현의 예입니다.
class FlyweightFactory: _cache = {} def __get(key): if key not in FlyweightFactory._cache: FlyweightFactory._cache[key] = Flyweight(key) return FlyweightFactory._cache[key] class Flyweight: def __init__(self, key): self.key = key
이 구현에서 팩토리 클래스는 키를 사용하면 "__init__()"를 여러 번 호출할 필요가 없습니다.
위 내용은 Python의 객체 생성에서 `__new__()` 다음에 `__init__()`가 항상 호출되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!