본문 바로가기
개발/파이썬

일급객체란?

by pandatta 2022. 9. 13.

https://blog.hexabrain.net/347

일급객체란, 다른 객체들에서 일반적으로 쓰는 연산을 지원하는 객체를 말합니다.

따라서 일급객체는 다른 객체에 인자로 넘겨지거나 반환값으로 사용될 수 있으며, 파이썬의 함수는 일급객체, 즉 일급함수로 사용됩니다.

객체 안에 다른 객체가 정의될 때 지역변수가 선언되면 전역으론 쓸 수가 없습니다.

def func1(arg1):
    global arg2
    return arg1 + arg2

arg2 = 1
print(func1(2)) # 3

지역에서 선언된 변수를 전역에서 쓰려면 위처럼 global을 선언해야 하는데, 당연히 어떻게 정의됐는지 불분명한 변수를 코드 스코프 전체에서 쓰면 불안정합니다.

이를 해결하기 위해 클로저를 쓸 수 있습니다. 클로저란, 반환값으로 내부함수를 반환하는 일급함수를 말합니다.

def 클로저함수(arg1):
    def 내부함수(arg2):
        return arg1 + arg2
    return 내부함수

object1 = 클로저함수(x)
print(object1(y)) # x + y

여기서 arg2는 클로저 내부에 있지만 y값으로 지정이 가능함을 볼 수 있습니다.

여기서 각각 지정된 argument x는,

object1.__closure__[argument인덱스].cell_contents

처럼 호출할 수 있습니다.

당연히 여러 번 중첩도 가능한데, 이 경우 arguments가 __closure__에 tuple로 추가가 됩니다.

def func1(x):
    def func2(y):
        def func3(z):
            return x + y + z
        return func3
    return func2

o1 = func1(1)
o2 = o1(2)
o3 = o2(3)
print(o3) # 6 = 1 + 2 + 3
print(o2.__closure__[0].cell_contents) # 1
print(o2.__closure__[1].cell_contents) # 2

댓글