Python용 __new__방법은 단례적인 조작을 실현한다

2392 단어 Pythonnew단례
소개
init 방법은 보통 하나의 클래스를 초기화할 때 사용되지만, 사실은 하나의 클래스를 실례화할 때 첫 번째로 호출되는 방법이 아니다.Student (id,name) 와 같은 표현식을 사용하여 하나의 클래스를 실례화할 때, 가장 먼저 호출되는 방법은 사실 new 방법이다.
new 방법이 받아들인 매개 변수도 init와 같지만 init는 클래스 실례를 만든 후에 호출됩니다. new 방법은 바로 이 클래스 실례를 만드는 방법입니다.
new는 대상에 공간을 분배합니다. 내장된 정적 방법입니다. new는 메모리에서 대상에 공간을 분배하고 대상의 인용을 되돌려줍니다. init는 이 인용을 얻어서 이 실례를 초기화합니다.
예제
아주 간단한 단례

class A:
 instance = None
 def __new__(cls, *args, **kwargs):
  if cls.instance is None:
   cls.instance = super().__new__(cls)
  return cls.instance
new 방법은 정적 방법(즉 정의할 때 cls 파라미터가 없기 때문에)이기 때문에 여기서cls 파라미터를 전송해야 합니다. 그리고 여기 있는 new는 당신이 개조했기 때문에 아버지의 new 방법으로 돌아가야 합니다.
이 방법에 따라 개조된 단례는 어떻게 new가 같은 실례이지만 init는 여러 번 실행됩니다. 즉, 몇 개의 대상을 만들고 몇 번의 초기화 방법을 호출합니다.그래서 init에 대한 판단을 좀 더 해야 돼요.

class A:
 instance = None
 init_flag = False #  

 def __new__(cls, *args, **kwargs):
  if cls.instance is None:
   cls.instance = super().__new__(cls)
  return cls.instance

 def __init__(self):
  if A.init_flag:
   return
  print(' ')
  A.init_flag = True

if __name__ == '__main__':
 a = A()
 b = A()
 print(a)
 print(b)
출력 결과:
초기화 방법 실행


총결산
new를 다시 불러오는 방법을 통해 단례를 비교적 간단하게 실현할 수 있다.Python은 재미있는 내장 함수가 많아서 틈이 나면 다시 연구할 수 있다.
보충 지식: Python 굶주림과 게으름뱅이 단례 모델의 실현
코드 보세요~

#  
class Singleton(object):
 #  __new__ 
 def __new__(cls):
  #  , , 
  if not hasattr(cls, 'instance'):
   cls.instance = super(Singleton, cls).__new__(cls)
  return cls.instance
아한식은 만들 때 실례가 생성됩니다.

#  
class Singleton(object):
 __instance = None
 def __init__(self):
  if not self.__instance:
   print(' __init__,  ')
  else:
   print(' __init__, :', __instance)

 @classmethod
 def get_instance(cls):
  #  get_instance Singleton 
  if not cls.__instance:
   cls.__instance = Singleton()
  return cls.__instance
이상 Python용__new__방법은 단례적인 조작을 실현하는 것이 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 될 수 있고 저희를 많이 사랑해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기