티스토리 뷰

Python 05, 06 - Magic function, First Class, Closure

- Magic function, First Class, 일급 시민 조건 3가지, Closure


  •  

<Magic function>

  1. method의 이름 앞뒤에 __가 붙어있는 method  
  2. class 안에 정의되어 있는 특수한 형태의 method
  3. 특수한 상황에서 그에 맞는 magic function이 callback (호출)된다.
  • magic function - overriding (오버라이딩) 하여 사용한다.
class Car(object):
    def __init__(self, model, price):
        self.model = model
        self.price = price
       
    del __dell__(self):
        print("소멸자가 호출되었습니다!")

    def __repr__(self):
        return self.model
    
    def __lt__(self, other):
        if self.price < other.price:
            return "{} 가격이 더 낮아요!!".format(self.model)
        else:
            return "{} 가격이 더 높아요!!".format(self.model)
a = 100
print(type(a))                  # class 'int'가 존재한다.

class MyInt(int):
    pass

my_num = MyInt(100)
print(my_num + 200)             # 300
print(my_num.__add__(200))      # 300

 

<First Class>

  • 1급 시민 => 함수를 runtime으로 생성할 수 있다.
  • 프로그램의 구성 요소 (객체-값, 객체, 함수)가 다음의 조건을 만족하면 first-class citizien이다.
    • 1) 구성요소가 변수나 데이터 구조의 속성으로 저장될 수 있다.
    • 2) 함수의 인자로 전달될 수 있다.
    • 3) 함수의 결과로 리턴될 수 있다.
  • python은 1급 시민 지원, Java는 미지원
  • 일반 숫자 타입의 데이터가 일급 시민인 이유
    • => 숫자 타입은 변수에 저장도 가능, 함수의 인자로 넘겨줄 수도, 함수의 결과로 리턴될 수도 있다.

 

<1급 시민 조건들>

  1. 함수를 변수에 저장할 수 있다.
  2. 함수를 다른 함수의 인자로 저장할 수 있다. => Decorator
  3. 함수를 다른 함수의 리턴값으로 사용할 수 있다. => cf) Closure
# 1급 시민 조건들
# 1. 함수를 변수에 저장할 수 있다.

def my_add(x, y):
    return x + y

print(my_add)       # <function my_add at 0x00000195179D45E8>

f = my_add          # 변수 안에 저장된 메모리주소를 변수 f에 저장
print(f)            # <function my_add at 0x00000263A7C945E8> => f도 같은 함수 pointing
print(f(100, 200))  # 300

# 2. 함수를 다른 함수의 인자로 전달할 수 있다.

def my_add(x, y):
    return x + y

def my_sub(x, y):
    return x - y


def my_operation(func, arg_list):
    result = []

    for (tmp1, tmp2) in arg_list:
        result.append(func(tmp1, tmp2))

    return result

data = [(1, 2), (3, 4), (5, 6)]

print(my_operation(my_add, data))       # [3, 7, 11]
print(my_operation(my_sub, data))       # [-1, -1, -1]

# 3. 함수를 다른 함수의 리턴값으로 사용할 수 있다. => cf) Closure

def addMaker():

    def my_add_maker():
        return 100

    return my_add_maker         # 실행코드 자체를 리턴

print(addMaker())                # <function addMaker.<locals>.my_add_maker at 0x0000021BF6914708>
print(addMaker()())              # 100

 

<Closure>

  • first-class function (일급 함수)의 개념을 이용하여 scope에 묶인 변수를 바인딩하기 위한 기술
  • 클로저는 데이터를 저장한 레코드다.
  • 스코프 안의 변수가 소멸되어도, 클로저를 통해 접근할 수 있다.
    • => 클로져를 이용하여 런타임시에 필요한 함수를 만들어 낼 수 있다. 
## Closure
def addMaker(x):        # x는 addMaker함수의 지역변수
    def my_add_maker(y):
        return x + y    # 지역변수 x가 사라지지 않고 실행됨
    return my_add_maker

add_5 = addMaker(5)
add_10 = addMaker(10)  # 함수를 동적으로 사용 가능 - runtime시 새로운 기능을 생성

print(add_5(100))      # 105
print(add_10(100))     # 110
  •  
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함