Python용 __new__방법은 단례적인 조작을 실현한다
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__방법은 단례적인 조작을 실현하는 것이 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 될 수 있고 저희를 많이 사랑해 주시기 바랍니다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.