이 글에서는 Python 연산자 오버로딩 예제 코드 공유에 대한 자세한 설명을 위해 관련 정보를 주로 소개합니다. 필요한 친구는
Python 연산자 오버로딩
Python을 참조하세요. 언어 제공 연산자 오버로딩 기능을 가지고 있으며 언어의 유연성을 향상시킵니다. 이는 C++와 다소 유사하지만 다소 다릅니다. 그 특별한 성격을 고려하여 오늘은 Python 연산자 오버로딩에 대해 논의하겠습니다.
Python 언어 자체는 많은 매직 메소드를 제공하며, Python 내장 매직 메소드를 다시 작성하여 연산자 오버로드를 수행합니다. 이러한 매직 메서드는 모두 __X__ 형식과 유사한 이중 밑줄로 시작하고 끝납니다. Python은 이 특수 명명 방법을 통해 연산자를 가로채서 오버로드를 달성합니다. Python의 내장 작업이 클래스 개체에 적용되면 Python은 개체에서 지정된 메서드를 검색하고 호출하여 작업을 완료합니다.
클래스는 덧셈과 뺄셈, 인쇄, 함수 호출, 인덱싱 등과 같은 내장 연산을 오버로드할 수 있습니다. 연산자 오버로드는 객체가 내장 객체와 동일하게 동작하도록 만듭니다. Python은 연산자를 호출할 때 자동으로 이러한 메서드를 호출합니다. 예를 들어 클래스가 __add__ 메서드를 구현하는 경우 클래스의 객체가 + 연산자에 나타날 때 이 메서드가 호출됩니다.
일반적인 연산자 오버로딩 방법
|
오버로딩 설명 | 연산자 호출 방법 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__init__ | 생성자 | 객체 생성: X = 클래스(args) | tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__del__ | 소멸자 | X 객체 회수 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__add__/__sub__ | 더하기 및 빼기 연산 | X +Y, X+ =Y/X-Y, | X|Y, X|=Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_repr__/__str__ | 인쇄/변환 | print(X), repr(X)/str(X) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__call__ | 함수 호출 | X(*args, **kwargs) td> | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__getattr__ | 속성 참조 | X .undefine | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__setattr__ | 속성 할당 | X.any= 값 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__delattr__ | 속성 삭제 | del td>X[key], 인덱스 할당X[key], X[i:j]=sequence | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__delitem__ | 인덱스 및 샤드 삭제 | del X [키], del X[i:j] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__len__ | 길이 | len(X) td> | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__bool__ | 부울 테스트 | bool(X) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__lt__, __gt__, __le__, __ge__, __eq__, __ne__ | 특정 비교 | 순서는 X |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__radd__ | 오른쪽 추가 | other+X | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
필드(향상된) 추가 | X+=Y(또는 __add__) td> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__iter__, __next__ | 반복 | I=iter(X ), next() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
회원 테스트 | X의 항목(X는 반복 가능한 모든 객체) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__index__ | 정수 값 | 16진수(X), bin(X), 8진수(X) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__enter__, __exit__ | 환경 관리자 | obj를 var로 사용: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__get__, __set__, __delete__ | 설명자 속성 | X.attr, X.attr= 값, del X.attr | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
__new__ | 만들기 | __init__ 이전에 객체 생성 td> |
다음은 일반적으로 사용되는 연산자 메소드의 사용법을 소개합니다.
생성자 및 소멸자: __init__ 및 __del__
주요 기능은 객체를 생성하고 재활용하는 것입니다. 인스턴스가 생성되면 __init__ 생성자는 다음과 같습니다. 라고 불리는. 인스턴스 객체가 회수되면 소멸자 __del__이 자동으로 실행됩니다.
>>> class Human(): ... def __init__(self, n): ... self.name = n ... print("__init__ ",self.name) ... def __del__(self): ... print("__del__") ... >>> h = Human('Tim') __init__ Tim >>> h = 'a' __del__
더하기 및 빼기 연산: __add__ 및 __sub__
이 두 가지를 오버로드합니다. 메서드를 사용하면 일반 객체에 +- 연산자 연산을 추가할 수 있습니다. 다음 코드는 +- 연산자를 사용하는 방법을 보여줍니다. 코드에서 __sub__ 메서드를 제거한 다음 빼기 연산자를 호출하면 오류가 발생합니다.
>>> class Computation(): ... def __init__(self,value): ... self.value = value ... def __add__(self,other): ... return self.value + other ... def __sub__(self,other): ... return self.value - other ... >>> c = Computation(5) >>> c + 5 10 >>> c - 3 2
객체의 문자열 표현: __repr__ 및 __str__
이 두 메서드는 모두 다음과 같습니다. 객체의 문자열 표현식을 나타내는 데 사용됩니다. print() 및 str() 메서드는 __str__ 메서드를 호출하고 print(), str() 및 repr() 메서드는 __repr__ 메서드를 호출합니다. 다음 예제에서 볼 수 있듯이 두 개의 메소드가 동시에 정의되면 Python은 먼저 __str__ 메소드를 검색하고 호출합니다.
>>> class Str(object): ... def __str__(self): ... return "__str__ called" ... def __repr__(self): ... return "__repr__ called" ... >>> s = Str() >>> print(s) __str__ called >>> repr(s) '__repr__ called' >>> str(s) '__str__ called'
인덱스 값 획득 및 할당: __getitem__, __setitem__
이 두 가지 메서드를 구현하면 X[i]와 같은 형태로 객체에 값을 가져와 할당할 수 있으며, 객체에 대한 슬라이싱 작업도 사용할 수 있습니다.
>>> class Indexer: data = [1,2,3,4,5,6] def __getitem__(self,index): return self.data[index] def __setitem__(self,k,v): self.data[k] = v print(self.data) >>> i = Indexer() >>> i[0] 1 >>> i[1:4] [2, 3, 4] >>> i[0]=10 [10, 2, 3, 4, 5, 6]
속성 설정 및 액세스: __getattr__, __setattr__
__getattr__ 및 __setattr_ _을 오버로드하여 다음에 대한 액세스를 차단할 수 있습니다. 객체 멤버. __getattr__은 객체에 존재하지 않는 멤버에 액세스할 때 자동으로 호출됩니다. __setattr__ 메서드는 객체 멤버를 초기화할 때 호출하는 데 사용됩니다. 즉, __dict__의 항목을 설정할 때 __setattr__ 메서드가 호출됩니다. 구체적인 예는 다음과 같습니다.
class A(): def __init__(self,ax,bx): self.a = ax self.b = bx def f(self): print (self.__dict__) def __getattr__(self,name): print ("__getattr__") def __setattr__(self,name,value): print ("__setattr__") self.__dict__[name] = value a = A(1,2) a.f() a.x a.x = 3 a.f()
위 코드를 실행한 결과는 다음과 같습니다. __getattr_ 존재하지 않는 변수 x _method에 액세스할 때 호출됩니다. __init__이 호출되면 할당 작업에서 __setattr__ 메서드도 호출됩니다.
__setattr__ __setattr__ {'a': 1, 'b': 2} __getattr__ __setattr__ {'a': 1, 'x': 3, 'b': 2}
Iterator 객체: __iter__, __next__
Python에서의 반복은 Load를 반복하여 직접 수행할 수 있습니다. 이를 달성하려면 __getitem__ 메소드를 사용하세요. 아래 예를 참조하세요.
>>> class Indexer: ... data = [1,2,3,4,5,6] ... def __getitem__(self,index): ... return self.data[index] ... >>> x = Indexer() >>> for item in x: ... print(item) ... 1 2 3 4 5 6
위의 방법으로도 Iteration이 가능하지만 최선의 방법은 아닙니다. Python의 반복 작업은 먼저 __iter__ 메서드 호출을 시도한 다음 __getitem__을 시도합니다. 반복 환경은 iterator 객체를 반환하는 __iter__ 메서드를 찾기 위해 iter를 사용하여 구현됩니다. 이 메서드가 제공되면 Python은 StopIteration 예외가 발생할 때까지 반복자 객체의 next() 메서드를 반복적으로 호출합니다. __iter__가 발견되지 않으면 Python은 __getitem__ 메커니즘을 사용하려고 시도합니다. 반복자의 예를 살펴보겠습니다.
class Next(object): def __init__(self, data=1): self.data = data def __iter__(self): return self def __next__(self): print("__next__ called") if self.data > 5: raise StopIteration else: self.data += 1 return self.data for i in Next(3): print(i) print("-----------") n = Next(3) i = iter(n) while True: try: print(next(i)) except Exception as e: break
프로그램의 실행 결과는 다음과 같습니다.
__next__ called 4 __next__ called 5 __next__ called 6 __next__ called ----------- __next__ called 4 __next__ called 5 __next__ called 6 __next__ called
구현이 이루어진 것을 볼 수 있습니다. __iter__ 및 __next__ 메서드 이후에는 for in 메서드를 통해 객체를 반복하거나 iter() 및 next() 메서드를 통해 객체를 반복할 수 있습니다.
읽어주셔서 감사합니다. 도움이 되기를 바랍니다. 이 사이트를 지원해 주셔서 감사합니다!
위 내용은 Python 연산자 오버로딩 예제 코드 공유에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!