WeniVooks

검색

견고한 파이썬

메서드 체이닝

1. 메서드 체이닝

메서드 체이닝(Method Chaining)은 파이썬과 같은 객체 지향 프로그래밍 언어에서 흔히 볼 수 있는 프로그래밍 기술입니다. 메서드 체이닝은 여러 메서드 호출을 연결하여 코드를 더 간결하고 읽기 쉽게 만드는 기술입니다. 한 객체의 메서드를 호출한 후 반환된 결과를 사용하여 다른 메서드를 계속 호출하는 방식으로, 코드를 간결하게 작성할 수 있습니다.

아래 예시는 메서드 체이닝을 활용하여 여러 문자열 연산을 한 라인에서 수행하는 방법입니다.

'Hello World'.replace('Hello', 'hi').lower() # 출력: hi world

이 방식은 먼저 아래 코드를 수행합니다.

'Hello World'.replace('Hello', 'hi') # 출력: hi World

이렇게 수행된 결과에 다시 lower를 실행합니다.

'hi World'.lower() # 출력: hi world

다만 아래와 같은 코드는 작동되지 않습니다.

'Hello World'.split(' ').lower() # error

위 코드는 먼저 아래 코드를 수행합니다.

'Hello World'.split(' ') # 출력: ['Hello', 'World']

이 코드의 반환값인 리스트에는 lower 메서드가 없으므로 이 코드는 error가 나게 됩니다.

['Hello', 'World'].lower() # error

이처럼 메서드 체이닝을 사용하기 위해서는 앞에서 반환된 값이 어떤 값인지가 중요합니다.

2. 나아가기

2.1 메서드 체이닝 구현하기

메서드 체이닝은 아래처럼 인스턴스의 메서드 연결로 구현할 수 있습니다.

class Calculator: def __init__(self, value): self.value = value def add(self, other): self.value += other return self def subtract(self, other): self.value -= other return self def multiply(self, other): self.value *= other return self def get_value(self): return self.value calc = Calculator(1) result = calc.add(2).subtract(1).multiply(3).get_value() print(result) # 결과: 6

위 코드에서 add, substract, multiply 메서드 연산의 반환값이 self이기 때문에 다른 메서드를 호출할 수 있는 것입니다. 만약 get_value에도 메서드 체이닝을 하고 싶다면 그 다음 메서드는 int의 메서드여야 합니다.

2.2 메서드 체이닝 연달아 사용하기

메서드를 길게 사용할 때의 예시입니다. 보통 가독성 때문이라도 이런식으로 메서드 체이닝을 연달아 사용하는 경우는 없습니다.

'Hello World'.replace('Hello', 'hi').replace('world', 'python').lower().replace(' ', '')

다만 부득이하게 이러한 코드를 작성했을 때에는 백슬래시(\)를 사용하여 메서드 체이닝을 여러 줄로 나눌 수 있습니다. 앞에 공백도 삽입이 가능합니다.

'Hello world'\ .replace('Hello', 'hi')\ .replace('world', 'python')\ .lower()\ .replace(' ', '')

메서드 체이닝은 코드를 간결하게 만들어 주지만, 너무 많이 체이닝을 사용하면 코드의 가독성을 해칠 수 있습니다. 각 메서드 호출의 반환값을 확인하기 어려우므로 디버깅도 어려워질 수 있습니다. 적절한 수준에서 메서드 체이닝을 사용하는 것이 중요합니다.

{"packages":["numpy","pandas","matplotlib","lxml"]}
13장 함수 심화13.2 일급함수와 고차함수