Python 연산자 오버로딩 예제 코드 공유에 대한 자세한 설명

高洛峰
풀어 주다: 2017-03-10 09:07:10
원래의
1295명이 탐색했습니다.

이 글에서는 Python 연산자 오버로딩 예제 코드 공유에 대한 자세한 설명을 위해 관련 정보를 주로 소개합니다. 필요한 친구는

Python 연산자 오버로딩

Python을 참조하세요. 언어 제공 연산자 오버로딩 기능을 가지고 있으며 언어의 유연성을 향상시킵니다. 이는 C++와 다소 유사하지만 다소 다릅니다. 그 특별한 성격을 고려하여 오늘은 Python 연산자 오버로딩에 대해 논의하겠습니다.

Python 언어 자체는 많은 매직 메소드를 제공하며, Python 내장 매직 메소드를 다시 작성하여 연산자 오버로드를 수행합니다. 이러한 매직 메서드는 모두 __X__ 형식과 유사한 이중 밑줄로 시작하고 끝납니다. Python은 이 특수 명명 방법을 통해 연산자를 가로채서 오버로드를 달성합니다. Python의 내장 작업이 클래스 개체에 적용되면 Python은 개체에서 지정된 메서드를 검색하고 호출하여 작업을 완료합니다.

클래스는 덧셈과 뺄셈, 인쇄, 함수 호출, 인덱싱 등과 같은 내장 연산을 오버로드할 수 있습니다. 연산자 오버로드는 객체가 내장 객체와 동일하게 동작하도록 만듭니다. Python은 연산자를 호출할 때 자동으로 이러한 메서드를 호출합니다. 예를 들어 클래스가 __add__ 메서드를 구현하는 경우 클래스의 객체가 + 연산자에 나타날 때 이 메서드가 호출됩니다.

일반적인 연산자 오버로딩 방법


tr> del td>X[key], 인덱스 할당__iadd____contains__

方法名

重载说明

运算符调用方式

__init__

构造函数

对象创建: X = Class(args)

__del__

析构函数

X对象收回

__add__/__sub__

加减运算

 X+Y, X+=Y/X-Y, X-=Y

__or__

运算符|

X|Y, X|=Y

_repr__/__str__

打印/转换

print(X)、repr(X)/str(X)

__call__

函数调用

X(*args, **kwargs)

__getattr__

属性引用

X.undefined

__setattr__

属性赋值

X.any=value

__delattr__

属性删除

del X.any

__getattribute__

属性获取

X.any

__getitem__

索引运算

X[key],X[i:j]

__setitem__

索引赋值

X[key],X[i:j]=sequence

__delitem__

索引和分片删除

del X[key],del X[i:j]

__len__

长度

len(X)

__bool__

布尔测试

bool(X)

__lt__, __gt__, 

__le__, __ge__, 

__eq__, __ne__

特定的比较

依次为XY,X<=Y,X>=Y, 

X==Y,X!=Y 

注释:(lt: less than, gt: greater than, 

  le: less equal, ge: greater equal, 

  eq: equal, ne: not equal 

__radd__

右侧加法

other+X

__iadd__

实地(增强的)加法

X+=Y(or else __add__)

__iter__, __next__

迭代

I=iter(X), next()

__contains__

成员关系测试

item in X(X为任何可迭代对象)

__index__

整数值

hex(X), bin(X),  oct(X)

__enter__, __exit__

环境管理器

with obj as var:

__get__, __set__, 

__delete__

描述符属性

X.attr, X.attr=value, del X.attr

__new__

创建

在__init__之前创建对象

메소드 이름
오버로딩 설명 연산자 호출 방법
__init__ 생성자 객체 생성: X = 클래스(args)
__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__ 속성 삭제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__ 특정 비교 순서는 XY, X< =Y, X>=Y, X==Y , ne: 같지 않음 )
__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(&#39;Tim&#39;) 
__init__ Tim 
>>> h = &#39;a&#39; 
__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) 
&#39;__repr__ called&#39; 
>>> str(s) 
&#39;__str__ called&#39;
로그인 후 복사

인덱스 값 획득 및 할당: __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__ 
{&#39;a&#39;: 1, &#39;b&#39;: 2} 
__getattr__ 
__setattr__ 
{&#39;a&#39;: 1, &#39;x&#39;: 3, &#39;b&#39;: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿