>  기사  >  백엔드 개발  >  Python 연산자 오버로드에 대한 코드 튜토리얼

Python 연산자 오버로드에 대한 코드 튜토리얼

Y2J
Y2J원래의
2017-05-15 11:34:251719검색

이 글에서는 주로 Python 연산자 오버로딩에 대한 자세한 설명과 예제 코드를 소개합니다. 필요한 친구는 Python 언어에서 제공하는

Python 연산자 오버로딩

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

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

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

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

len(X)bool(X)le , ge, 특정 비교 eq: 같음, ne: 같지 않음 iadd필드(향상) 추가X+=Y( 또는 반복 멤버십 테스트 항목 hex(X), bin(X), oct(X)입력, 종료환경 관리자obj를 var로 사용:가져오기, 설정, X.attr, X.attr=value , del X.attr

메소드 이름

오버로딩 설명

연산자 호출 방법

init

생성자

객체 생성: X = Class(args)

del

소멸자

X 객체 회수

추가/ sub

더하기 및 빼기 연산

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

또는

연산자|

X|Y, X|= Y

_repr/str

인쇄/변환

인쇄(X), repr (X)/str(X)

call

함수 호출

X(*args, **kwargs)

getattr

속성참조

X.undefine

setattr

속성 할당

X.any=value

delattr

속성삭제

del X.any

getattribute

속성 get

X.any

getitem

인덱스 연산

X[key], X[i:j]

설정 항목

색인 할당

X[키], X [i:j] =순서

삭제

인덱스 및 샤드 삭제

del X[키], del

bool

부울 테스트

lt, gt,

eq, ne

는 X632bf1420c84fd56a79a6bad534b1b35Y, X<=입니다. Y, X> =Y,

X==Y, : 덜 같음, ge: 더 같음,

)

radd

오른쪽 추가

기타+X

else

추가)

iter,

다음

I=iter(X) , next()

포함

삭제

설명 속성

new

초기화 전

생성 객체 생성

다음은 일반적으로 사용되는 연산자 메소드의 사용법을 소개합니다.

생성자 및 소멸자: init 및 del

주요 기능은 인스턴스가 생성될 때 객체를 생성하고 재활용하는 것입니다. 🎜> 생성자 메서드가 호출됩니다. 인스턴스 객체가 회수되면 소멸자 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

더하기 및 빼기 연산: 더하기 및 빼기

이 두 메서드를 오버로드하면 + 연산자 연산을 일반 개체에 추가할 수 있습니다. 다음 코드는 +- 연산자를 사용하는 방법을 보여줍니다. 코드에서 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

String 객체 표현 형식: repr 및 str

이 두 가지 방법은 객체 String의 문자를 나타내는 데 사용됩니다. 표현식 형식: 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()

위 코드의 실행 결과는 다음과 같습니다. 결과를 보면 존재하지 않는

변수 x; 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의 반복은 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을 시도합니다. 반복 환경은 iter 객체를 반환하는 iter 메서드를 찾기 위해 iter를 사용하여 구현됩니다. 이 메서드가 제공되면 Python은 S

top

Iteration 예외가 발생할 때까지 반복자 개체의 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를 통해 반복할 수 있으며, iter() 및 next() 메서드를 통해 객체를 반복할 수도 있습니다. 【관련 추천사항】

1.

특별 추천: "php Programmer Toolbox" V0.1 버전 다운로드2.

무료 Python 동영상 튜토리얼

3.

Python 기본 입문 튜토리얼

위 내용은 Python 연산자 오버로드에 대한 코드 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.