본문 바로가기
관리자

Programming-[Backend]/Python

파이썬 중급 - 2. 매직 메서드, namedtuple

728x90
반응형

매직 메서드

 

기본 원리

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)

https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-%EC%9D%B8%ED%94%84%EB%9F%B0-%EC%98%A4%EB%A6%AC%EC%A7%80%EB%84%90/dashboard

728x90
반응형