상세 컨텐츠

본문 제목

[인프런 리프 2기] 06. 파이썬 중급 과정 2주차(4) 데이터 모델-1

경험/2021 인프런리프2기

by mizu-umi 2021. 3. 21. 00:55

본문

728x90

관련글 ▼

[인프런 리프 2기] 03. 파이썬 중급 과정 2주차(1) 클래스 심화-1

[인프런 리프 2기] 04. 파이썬 중급 과정 2주차(2) 클래스 심화-2

[인프런 리프 2기] 05. 파이썬 중급 과정 2주차(3) 클래스 심화-3

 


파이썬 데이터 모델 - 매직 메소드 (1)

  • 파이썬 핵심 구조 설명
  • 매직 메소드 실습
  • 클래스 매직 메소드 실습

이전까지는 클래스에 대해서 배웠다면 이번에는 클래스에 구현되는 메소드 중 특별한 기능을 가진 매직 메소드에 대해서 배우는 시간이었다. 이전 강의를 보면서 '클래스라는 게 int나 str같은 자료형들처럼 내가 원하는 무언가(?)를 임의로 작성해서 수행되게 만드는 건가?'라는 생각을 했는데 이번 강의를 통해 그 생각이 어느 정도 맞았음을 실감했다.

 

 


매직 메소드란?

파이썬에서 사칙연산 같은 유형(type)에 특정한 수행을 실행하는 메소드를 의미한다. 매직(magic) 혹은 스페셜(special) 메소드라고도 불리며 __ (double underscores)로 시작하고 끝난다. (출처: 파이썬 용어집).

다르게 정리하면, 클래스 안에 정의할 수 있는 특별한(built-in) 메소드로 파이썬에 이미 내장되어 있는 메소드를 매직 메소드라고 한다. 예를 들면 사칙연산 같은 어떠한 수행이 주어졌을 때 내장되어 있는 메소드인 매직메소드가 작동하면서 훨씬 편리한 코딩이 가능하도록 도와줌.

 

파이썬의 핵심 구조는 아래와 같다.

 

  • 시퀀스(sequence)
  • 반복(iterator)
  • 함수(functions)
  • 클래스(class)

 

이 핵심구조들을 자세히 잘 알고 있으면 파이썬을 잘 활용할 수 있다.

 

매직 메소드를 실습해보자(1)

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

    def __sub__(self, x):
        return self._price - x._price
        
s1 = Fruit('Orange', 7500)
s2 = Fruit('Banana', 3000)

print(s1 + s2)
print(s1 - s2)

잠깐, x는 왜 들어갈까?

→ 첫번째 인수와 그 다음으로 오는 값의 더하기를 수행해야하므로 x같은 별도의 parameter를 요구한다.

 

__add__라는 매직 메소드를 클래스 안에 작성했기 때문에 s1+s2를 하면 당연히 price끼리 더해진다. 만약 __add__라는 매직 메소드 없이 단순히 s1 + s2, 혹은 s1.__add__(s2)를 입력하면 아래와 같은 TypeError가 난다.

 

Traceback (most recent call last):
  File "c:\workspace\python_seed\venv\c03_01.py", line 45, in <module>
    print(s1 + s2)
TypeError: unsupported operand type(s) for +: 'Fruit' and 'Fruit'

 

매직 메소드는 __add__만 해도 곱하기나 나누기를 할 수 있도록 도와준다.

 

왜? 메소드 안에 해당하는 수행문 이외의 다양한 수행문을 작성할 수 있으니까.

 

예를 들어 매직 메소드를 이용해 상기에 작성한 클래스 내부의 __add__ 메소드에 아래와 같이 작성하면,

 

def __add__(self,x):
    return (self._price + x._price) * 0.8

print(s1 + s2)를 했을 때 더해진 값에 * 0.8을 한 값이 계산되어 출력된다.

 

매직 메소드를 실습해보자(2)

※ 강의를 들으며 혼자 이것저것 해보다가 메모한 것. 강의 내용과 상이함.

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 __le__(self, x):
        print ('Called __le__')
        if self._price <= x._price:
            print('{} is cheaper than {}'.format(self._name, x._name))
        else:
            print('{} is more expensive than {}'.format(self._name, x._name))

    def __ge__(self, x):
        print ('Called __ge__')
        if self._price <= x._price:
            print('{} is cheaper than {}'.format(self._name, x._name))
        else:
            print('{} is more expensive than {}'.format(self._name, x._name))

s1 = Fruit('Orange', 7500)
s2 = Fruit('Banana', 3000)
  • __le__ → 첫번째 <= 두번째 비교.
  • __ge__ → 첫번째 >= 두번째 비교.

1. 가장 처음 했던 뻘짓

print(s1 >=  s2) 를 작성했을 때

 

내가 원했던 결과

Called __ge__
Orange is more expensive than Banana

출력된 결과

Called __ge__
Orange is more expensive than Banana
None ← 결과에 none이 왜 떴을까?

s1이 s2보다 크거나 같은지 판단하라고 했을 때 클래스의 매직 메소드에서 self._price에 s1의 price가, x._price에 s2의 price가 대입된다. 7500은 3000보다 크므로 오렌지가 더 비싸다는 게 출력된다. 근데 none은 무엇을 의미하는 none이지? 🤔

 

2. None이 출력되는 이유를 찾아보았다.

메소드에 return값이 없는 상황에서 print를 하라고 하기 때문에 마지막에 return할 게 없다는 의미로 none이 나온다!

print문을 사용하고도 none이 나오지 않게 하려면 print에서 또 print를 할게 아니라 클래스.메소드(인스턴스)로 입력해야한다.

 

Fruit.__le__(s1,s2)
Fruit.__ge__(s2,s1)

로 변경하고 나니

 

Called __le__
Orange is more expensive than Banana
Called __ge__
Banana is cheaper than Orange

만 출력되었다.

 


< 강의 출처 - 인프런 우리를 위한 프로그래밍 파이썬 중급 (Inflearn Original) >

728x90
반응형

관련글 더보기

댓글 영역