Python 클래스 내에 정의된 _ _ xx _ _로 끝나는 메서드는 모두 매직 메서드라고도 하는 클래스의 내장 메서드입니다.
클래스의 내장 메소드는 특정 조건이 충족되면 자동으로 실행됩니다. 여기서는 인스턴스 생성과 관련된 __init__ 및 __new__를 중점적으로 설명합니다.
__init__(self)에 대한 간략한 설명: 우리는 이 메서드에 대해 비교적 익숙합니다. Python 클래스의 기본 초기화 메서드로, 클래스가 인스턴스화될 때 실행되는 메서드입니다.
__new__ 메소드 재작성에 대한 자세한 설명은 일반적으로 다음과 같이 매우 고정되어 있습니다.
def __new__(cls): return super().__new__(cls)
여기서 cls는 클래스 자체를 나타냅니다.
__new__ 메서드를 다시 작성하는 코드는 매우 고정되어 있습니다. __new__ 메서드를 다시 작성할 때 super().__new__(cls)를 반환하거나 object.__new__(cls)를 반환해야 합니다. 그렇지 않으면 Python 인터프리터가 할당할 수 없습니다. space.객체 참조, 객체의 초기화 메소드는 호출되지 않습니다. 예:
class Mycls: def __new__(cls): print('new') return super().__new__(cls) def __init__(self): print('init') my=Mycls()
출력:
new가 init 이전에 출력되는 것을 볼 수 있으며, 이는 __init__(self) 이전에 __new__(cls)가 실행되었음을 증명합니다.
코드를 다시 작성합니다:
def __new__(cls): print('new') my=Mycls() print(my)
출력:
__new__(cls):에 반환 값이 없으면 인스턴스가 반환되지 않고 __init__(self )은 실행되지 않습니다.
1. __new__() 메서드는 클래스가 인스턴스화되기 전에 먼저 호출됩니다. __init__() 메서드는 인스턴스를 초기화하는 데 사용됩니다. 이 메서드는 인스턴스 개체가 생성된 후 호출되며 클래스 인스턴스 개체의 일부 초기 값을 설정하는 데 사용됩니다.
2. __init__() 메서드와 __new__() 메서드가 모두 클래스에 나타나면 __new__() 메서드가 먼저 호출된 다음 __init__() 메서드가 호출됩니다. __new__() 메서드는 인스턴스 생성의 첫 번째 단계입니다. 실행 후 생성된 클래스의 인스턴스를 반환해야 합니다. 그렇지 않으면 오류가 보고되고 __init__() 메서드를 실행할 수 없습니다. 그 중 __init__() 메서드는 어떤 정보도 반환하지 않습니다.
일부 학생들은 __new__로 무엇을 얻을 수 있는지 묻습니다.
개인적으로는 싱글톤이 가장 고전적인 애플리케이션이라고 생각합니다. 싱글톤 패턴은 일반적으로 사용되는 소프트웨어 디자인 패턴입니다. 이 패턴의 주요 목적은 특정 클래스의 인스턴스가 하나만 존재하도록 하는 것입니다. 싱글톤 객체는 특정 클래스의 인스턴스 하나만 전체 시스템에 나타나기를 원할 때 유용합니다. 예를 들어, 시스템에는 여러 개의 인쇄 작업이 있을 수 있지만 작업 작업은 하나만 있을 수 있습니다. 시스템에는 창 관리자나 파일 시스템이 하나만 있을 수 있습니다. 시스템에는 타이밍 도구나 ID(일련 번호) 생성기가 하나만 있을 수 있습니다.
구체적인 구현 코드는 다음과 같습니다.
class Mycls: _instance = None def __new__(cls): # 判断该类的属性是否为空;对第一个对象没有被创建,我们应该调用父类的方法,为第一个对象分配空间 if cls._instance == None: # 把类属性中保存的对象引用返回给python的解释器 cls._instance = object.__new__(cls) return cls._instance # 如果cls._instance不为None,直接返回已经实例化了的实例对象 else: return cls._instance def __init__(self): print('init') my1=Mycls() print(my1) my2=Mycls() print(my2)
출력:
init <__main__.Mycls object at 0x000000406E471148> Init <__main__.Mycls object at 0x000000406E471148>
my1과 my2라고 하지만 둘 다 객체 0x000000406E471148임을 알 수 있습니다.
위 내용은 Python 인터뷰에서 자주 묻는 질문: __Init__과 __New__의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!