>백엔드 개발 >파이썬 튜토리얼 >Python 인터뷰에서 자주 묻는 질문: __Init__과 __New__의 차이점

Python 인터뷰에서 자주 묻는 질문: __Init__과 __New__의 차이점

PHPz
PHPz앞으로
2023-04-12 14:31:061507검색

Python 인터뷰에서 자주 묻는 질문: __Init__과 __New__의 차이점

Python 클래스 내에 정의된 _ _ xx _ _로 끝나는 메서드는 모두 매직 메서드라고도 하는 클래스의 내장 메서드입니다.

클래스의 내장 메소드는 특정 조건이 충족되면 자동으로 실행됩니다. 여기서는 인스턴스 생성과 관련된 __init__ 및 __new__를 중점적으로 설명합니다.

__init__

__init__(self)에 대한 간략한 설명: 우리는 이 메서드에 대해 비교적 익숙합니다. Python 클래스의 기본 초기화 메서드로, 클래스가 인스턴스화될 때 실행되는 메서드입니다.

__new__

__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

new가 init 이전에 출력되는 것을 볼 수 있으며, 이는 __init__(self) 이전에 __new__(cls)가 실행되었음을 증명합니다.

코드를 다시 작성합니다:

def __new__(cls):
 print('new')
my=Mycls()
print(my)

출력:

  • new
  • None

__new__(cls):에 반환 값이 없으면 인스턴스가 반환되지 않고 __init__(self )은 실행되지 않습니다.

__new__ 및 __init__ 요약

1. __new__() 메서드는 클래스가 인스턴스화되기 전에 먼저 호출됩니다. __init__() 메서드는 인스턴스를 초기화하는 데 사용됩니다. 이 메서드는 인스턴스 개체가 생성된 후 호출되며 클래스 인스턴스 개체의 일부 초기 값을 설정하는 데 사용됩니다.

2. __init__() 메서드와 __new__() 메서드가 모두 클래스에 나타나면 __new__() 메서드가 먼저 호출된 다음 __init__() 메서드가 호출됩니다. __new__() 메서드는 인스턴스 생성의 첫 번째 단계입니다. 실행 후 생성된 클래스의 인스턴스를 반환해야 합니다. 그렇지 않으면 오류가 보고되고 __init__() 메서드를 실행할 수 없습니다. 그 중 __init__() 메서드는 어떤 정보도 반환하지 않습니다.

__new__의 적용

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

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제