매직 메서드
기본 원리
n = 10
n + 100 이나, n.add(100)은 같은 결과를 낸다. 왜냐하면 type(n) == class ‘int’ 인데, int 내부의 add 메서드를 + 로 래핑해놓은 것이기 때문이다. 이것은 다른 의미로, add 메서드를 override하면 +의 연산 로직을 정의할 수 있다는 것이다. 아래 예시처럼 특정 인스턴스를 더했을 때, 각 인스턴스가 갖는 price값을 더해서 return하도록 만들어줄 수 있다.
class Fruit:
def __init__(self, name, price):
self._name = name
self._price = price
def __str__(self):
return 'Fruit Class Info : {} , {}'.format(self._name, self._price)
def __add__(self, x):
return self._price + x._price
# 인스턴스 생성
s1 = Fruit('Orange', 7500)
s2 = Fruit('Banana', 3000)
#결과 출력
print(s1 + s2) #10500
Named Tuple
클래스 형식으로 튜플을 추상화하여 해당 인스턴스가 갖는 의미를 미리 정해놓는다. 예를 들어 pt1 = (1.0, 5.0) 이라고만 정의하면 뒤에 인자가 더 올 수 있는지, 어떤 맥락에서 사용하는 변수인지 알기가 어렵다. 그러나 namedtuple은 다른 방식으로 사용할 수 있다.
from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt3 = Point(1.0, 5.0)
print(pt3) # Point(x=1.0, y=5.0)
namedtuple로 Point라는 변수를 정의하였고 인자로 x, y를 받아온다고 선언하였다. 이제 받아오는 인자를 명기하고 사용 목적을 이름으로 표현할 수 있게 되었다.(첫 번째 인자는 해당 namedtuple의 이름을 지정하는 것이며 보통 namedtuple의 이름과 동일하게 쓴다)
namedtuple 변수 인자 선언 방법
Point1 = namedtuple(’Point’, ['x', 'y'])
Point2 = namedtuple(’Point’, 'x, y')
Point3 = namedtuple(’Point’, 'x y')
Point4 = namedtuple(’Point’, 'x y x class', rename=True) #중복되는 변수나 class와 같은 예약어가 있는 경우 rename=True로 줘야한다
Point4와 같이 rename 인자 값을 True로 주면 출력시에 _2, _3 등의 변수로 만들어서 출력해준다
p = Point4(10, 20, 30, 40)
print(p) #Point(x=10, y=20, _2=30, _3=40)
namedtuple 메서드
_make
인자 목록을 리스트로 받아올 수 있다. 물론 이때 namedtuple에서 정의한 인자의 개수와 리스트의 길이가 일치해야한다.
temp = [52, 38]
p4 = Point1._make(temp)
print(p4) #Point(x=52, y=38)
_fields
필드 이름을 조회한다.
print(p1._fields) #('x', 'y')
_asdict()
OrderedDict를 반환한다.
print(p1._asdict()) #OrderedDict(['x', 10), ('y', 35)]
실습 코드
from collections import namedtuple
Classes = namedtuple("Classes", "rank, number")
numbers = [str(n) for n in range(1, 21)]
ranks = "A B C D".split()
print(numbers)
print(ranks)
# List Comprehension
students = [Classes(rank, number) for rank in ranks for number in numbers]
print(len(students))
print(students)
"""
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']
['A', 'B', 'C', 'D']
80
[Classes(rank='A', number='1'), Classes(rank='A', number='2'), Classes(rank='A', number='3'), Classes(rank='A', number='4'), Classes(rank='A', number='5'), Classes(rank='A', number='6'), Classes(rank='A', number='7'), Classes(rank='A', number='8'), Classes(rank='A', number='9'), Classes(rank='A', number='10'), Classes(rank='A', number='11'), Classes(rank='A', number='12'), Classes(rank='A', number='13'), Classes(rank='A', number='14'), Classes(rank='A', number='15'), Classes(rank='A', number='16'), Classes(rank='A', number='17'), Classes(rank='A', number='18'), Classes(rank='A', number='19'), Classes(rank='A', number='20'), Classes(rank='B', number='1'), Classes(rank='B', number='2'), Classes(rank='B', number='3'), Classes(rank='B', number='4'), Classes(rank='B', number='5'), Classes(rank='B', number='6'), Classes(rank='B', number='7'), Classes(rank='B', number='8'), Classes(rank='B', number='9'), Classes(rank='B', number='10'), Classes(rank='B', number='11'), Classes(rank='B', number='12'), Classes(rank='B', number='13'), Classes(rank='B', number='14'), Classes(rank='B', number='15'), Classes(rank='B', number='16'), Classes(rank='B', number='17'), Classes(rank='B', number='18'), Classes(rank='B', number='19'), Classes(rank='B', number='20'), Classes(rank='C', number='1'), Classes(rank='C', number='2'), Classes(rank='C', number='3'), Classes(rank='C', number='4'), Classes(rank='C', number='5'), Classes(rank='C', number='6'), Classes(rank='C', number='7'), Classes(rank='C', number='8'), Classes(rank='C', number='9'), Classes(rank='C', number='10'), Classes(rank='C', number='11'), Classes(rank='C', number='12'), Classes(rank='C', number='13'), Classes(rank='C', number='14'), Classes(rank='C', number='15'), Classes(rank='C', number='16'), Classes(rank='C', number='17'), Classes(rank='C', number='18'), Classes(rank='C', number='19'), Classes(rank='C', number='20'), Classes(rank='D', number='1'), Classes(rank='D', number='2'), Classes(rank='D', number='3'), Classes(rank='D', number='4'), Classes(rank='D', number='5'), Classes(rank='D', number='6'), Classes(rank='D', number='7'), Classes(rank='D', number='8'), Classes(rank='D', number='9'), Classes(rank='D', number='10'), Classes(rank='D', number='11'), Classes(rank='D', number='12'), Classes(rank='D', number='13'), Classes(rank='D', number='14'), Classes(rank='D', number='15'), Classes(rank='D', number='16'), Classes(rank='D', number='17'), Classes(rank='D', number='18'), Classes(rank='D', number='19'), Classes(rank='D', number='20')]
"""
참조
1. 인프런 강의 - 우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
'Programming-[Backend] > Python' 카테고리의 다른 글
파이썬 중급 - 4. 해시테이블(Dictionary), Set (0) | 2022.07.17 |
---|---|
파이썬 중급 - 3. 시퀀스, 제너레이터, sorted, unpacking, immutable 등 (0) | 2022.07.17 |
파이썬 중급 - 1. 클래스와 메서드 (0) | 2022.07.17 |
Python 라이브러리 실행 에러 : Windows 환경에서 pip install 정확히 하기(black, isort 실행 문제) (2) | 2022.07.08 |
파이썬 기본 - 4. 입력과 출력, 클래스, 모듈, 패키지, 예외처리, 내장/외장 함수 (0) | 2022.06.05 |