> 백엔드 개발 > 파이썬 튜토리얼 > Python의 객체 생성에서 `__new__()` 다음에 `__init__()`가 항상 호출되는 이유는 무엇입니까?

Python의 객체 생성에서 `__new__()` 다음에 `__init__()`가 항상 호출되는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-19 15:47:11
원래의
455명이 탐색했습니다.

Why is `__init__()` Always Called After `__new__()` in Python's Object Creation?

"__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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿