산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> python

파이썬 연산자 오버로딩

Python 연산자 오버로딩

사용된 피연산자에 따라 Python에서 연산자의 의미를 변경할 수 있습니다. 이 튜토리얼에서는 Python 객체 지향 프로그래밍에서 연산자 오버로딩을 사용하는 방법을 배웁니다.

Python 연산자 오버로딩

Python 연산자는 내장 클래스에서 작동합니다. 그러나 동일한 연산자는 유형에 따라 다르게 동작합니다. 예를 들어, + 연산자는 두 개의 숫자에 산술 덧셈을 수행하거나 두 개의 목록을 병합하거나 두 개의 문자열을 연결합니다.

동일한 연산자가 컨텍스트에 따라 다른 의미를 가질 수 있도록 하는 Python의 이러한 기능을 연산자 오버로딩이라고 합니다.

사용자 정의 클래스의 객체와 함께 사용하면 어떻게 될까요? 2차원 좌표계에서 한 점을 시뮬레이션하는 다음 클래스를 살펴보겠습니다.

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y


p1 = Point(1, 2)
p2 = Point(2, 3)
print(p1+p2)

출력

Traceback (most recent call last):
  File "<string>", line 9, in <module>
    print(p1+p2)
TypeError: unsupported operand type(s) for +: 'Point' and 'Point'

여기에서 TypeError Python이 두 개의 Point를 추가하는 방법을 몰랐기 때문에 제기되었습니다. 함께 개체.

그러나 연산자 오버로딩을 통해 Python에서 이 작업을 수행할 수 있습니다. 하지만 먼저 특수 기능에 대한 개념을 알아보겠습니다.

<시간>

파이썬 특수 기능

이중 밑줄 __로 시작하는 클래스 함수 파이썬에서는 특수 함수라고 합니다.

이러한 함수는 클래스에 대해 정의하는 일반적인 함수가 아닙니다. __init__() 위에서 정의한 함수가 그 중 하나입니다. 해당 클래스의 새 객체를 생성할 때마다 호출됩니다.

파이썬에는 다른 수많은 특수 기능이 있습니다. Python 특수 기능에 대해 자세히 알아보려면 방문하십시오.

특수 함수를 사용하여 클래스를 내장 함수와 호환되도록 만들 수 있습니다.

>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>

print()를 원한다고 가정합니다. Point의 좌표를 출력하는 함수 우리가 얻은 것 대신에 개체. __str__()을 정의할 수 있습니다. 객체가 인쇄되는 방식을 제어하는 ​​클래스의 메서드입니다. 이를 달성할 수 있는 방법을 살펴보겠습니다.

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y
    
    def __str__(self):
        return "({0},{1})".format(self.x,self.y)

이제 print()를 사용해 보겠습니다. 다시 작동합니다.

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return "({0}, {1})".format(self.x, self.y)


p1 = Point(2, 3)
print(p1)

출력

(2, 3)

그게 낫다. 내장 함수 str()를 사용할 때 동일한 메서드가 호출됩니다. 또는 format() .

>>> str(p1)
'(2,3)'

>>> format(p1)
'(2,3)'

따라서 str(p1)을 사용하면 또는 format(p1) , Python은 내부적으로 p1.__str__() 방법. 따라서 이름, 특수 기능.

이제 연산자 오버로딩으로 돌아가자.

<시간>

+ 연산자 오버로딩

+를 오버로드하려면 연산자를 사용하려면 __add__()을 구현해야 합니다. 클래스의 기능. 큰 힘에는 큰 책임이 따른다. 우리는 이 함수 안에서 우리가 원하는 무엇이든 할 수 있습니다. 그러나 Point을 반환하는 것이 더 합리적입니다. 좌표 합계의 개체입니다.

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return "({0},{1})".format(self.x, self.y)

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Point(x, y)

이제 더하기 작업을 다시 시도합니다.

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return "({0},{1})".format(self.x, self.y)

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Point(x, y)


p1 = Point(1, 2)
p2 = Point(2, 3)

print(p1+p2)

출력

(3,5)

실제로 일어나는 일은 p1 + p2 , Python은 p1.__add__(p2)를 호출합니다. 차례로 Point.__add__(p1,p2)입니다. . 그 후, 추가 작업은 우리가 지정한 방식으로 수행됩니다.

마찬가지로 다른 연산자도 오버로드할 수 있습니다. 구현해야 하는 특수 기능은 아래 표에 나와 있습니다.

연산자 표현식 내부적으로
추가 p1 + p2 p1.__add__(p2)
빼기 p1 - p2 p1.__sub__(p2)
곱하기 p1 * p2 p1.__mul__(p2)
p1 ** p2 p1.__pow__(p2)
사업부 p1 / p2 p1.__truediv__(p2)
층 부문 p1 // p2 p1.__floordiv__(p2)
나머지(모듈로) p1 % p2 p1.__mod__(p2)
비트 왼쪽 시프트 p1 << p2 p1.__lshift__(p2)
비트 오른쪽 시프트 p1 >> p2 p1.__rshift__(p2)
비트 AND p1 & p2 p1.__and__(p2)
비트 OR p1 | p2 p1.__or__(p2)
비트 XOR p1 ^ p2 p1.__xor__(p2)
비트 단위 아님 ~p1 p1.__invert__()
<시간>

비교 연산자 오버로딩

Python은 연산자 오버로딩을 산술 연산자로만 제한하지 않습니다. 비교 연산자도 오버로드할 수 있습니다.

보다 작은 기호 <를 구현하려고 한다고 가정합니다. Point의 기호 수업.

원점에서 이러한 점의 크기를 비교하고 이를 위해 결과를 반환하겠습니다. 다음과 같이 구현할 수 있습니다.

# overloading the less than operator
class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return "({0},{1})".format(self.x, self.y)

    def __lt__(self, other):
        self_mag = (self.x ** 2) + (self.y ** 2)
        other_mag = (other.x ** 2) + (other.y ** 2)
        return self_mag < other_mag

p1 = Point(1,1)
p2 = Point(-2,-3)
p3 = Point(1,-1)

# use less than
print(p1<p2)
print(p2<p3)
print(p1<p3)

출력

True
False
False

마찬가지로, 다른 비교 연산자를 오버로드하기 위해 구현해야 하는 특수 기능이 아래 표에 나와 있습니다.

연산자 표현식 내부
미만 p1 < p2 p1.__lt__(p2)
작거나 같음 p1 <= p2 p1.__le__(p2)
같음 p1 == p2 p1.__eq__(p2)
같지 않음 p1 != p2 p1.__ne__(p2)
보다 큼 p1 > p2 p1.__gt__(p2)
크거나 같음 p1 >= p2 p1.__ge__(p2)

python

  1. 파이썬 데이터 유형
  2. 파이썬 연산자
  3. 파이썬 통과 문
  4. 파이썬 함수 인수
  5. 파이썬 사전
  6. 파이썬 상속
  7. 파이썬 반복자
  8. 파이썬 클로저
  9. 파이썬 @property 데코레이터
  10. 파이썬 날짜 시간