클래스 대신 함수

매일 공부(ML)·2022년 6월 30일
0

이어드림

목록 보기
88/146

간딘힌 인터페이스의 경우 클래스 대신 함수를 받아라

API의 함수를 변경하는 것: 훅

  • 파이썬은 KEY파라미터를 활용하여 변경이 가능

  • 파이썬은 일급 시민 객체이다.

    • 함수나 메서드를 다른 함수 혹은 변수로 참조 가능
# 디폴트 값이 훅이 존재하지 않는 키에 접근한 총 횟수
# 클로저 , 도우미 함수 활용

def increment_with_report(current, increments):
    added_count = 0

    def missing():
        nonlocal added_count #상태가 있는 클로저
        added_count +=1
        return 0

    result =  defaultdict(missing, current)
    for key, amount in increments:
        result[key] += amount

    return result, added_count

result, count =  increment_with_report(current, increments)
assert count ==2

#클래스의 명목화

#defaultdict의 디폴트 값 훅으로 사용해서 존재하지 않는 키에 접근한 횟수 추적

"""
모든 객체를 호출 가능한 객체
"""

class BetterCountMissing:
    def __init__(self):
        self.added = 0

    def __call__(self):
        self.added = 1
        return 0

counter =  BetterCountMissing()
assert counter() == 0
assert callable(counter)

counter = BetterCountMissing()
result = defaultdict(counter, current) #__call__에 의존
for key, amount in increments:
    result[key] += amount
assert counter.added == 2

Summary

  • 파이썬의 여러 컴포넌트 사이에 간단한 인터페이스가 필요할 때는 클래스를 정의하고 인스턴스화하는 대신 간단한 함수 사용

  • 파이썬 함수나 메서드는 일급 시민으로 함수나 함수 참조를 식에 사용

  • call특별 메서드를 사용하면 클래스의 인스턴스인 객체를 일반 파이썬 함수처럼 호출

  • 상태를 유지하기 위해서 함수가 필요한 경우 상태있는 클로저를 정의하는 대신 call메서드가 있는 클래스 정의

profile
성장을 도울 아카이빙 블로그

0개의 댓글