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
파이썬 strptime() 이 기사에서는 문자열에서 datetime 객체를 만드는 방법을 배웁니다(예제를 통해). 동영상:Python의 날짜 및 시간 strptime() 메소드는 주어진 문자열에서 datetime 객체를 생성합니다. 참고: datetime을(를) 만들 수 없습니다. 모든 문자열의 개체. 문자열은 특정 형식이어야 합니다. 예시 1:문자열을 datetime 개체로 from datetime import datetime date_string = 21 June, 2018 print(date_string =,
놓치신 경우:Python 2는 2020년 1월 1일부로 공식적으로 지원되지 않음 . 아직 Python 2.7을 사용 중이라면 지금 업그레이드하세요. . 실행 중인 버전이 확실하지 않은 경우 Python 버전을 확인하세요. 많은 패키지 유지 관리자가 Python 3으로 마이그레이션했습니다. 일부는 여전히 Python 2를 지원하고 다른 일부는 이미 Python 2 지원을 중단했습니다. Python 2 코드 기반에서 마이그레이션해야 하는 경우 Python 코드를 Python 3으로 마이그레이션하는 방법에 대한 가이드를 읽어보세요.