클래스를 이용한 호출 가능한 객체
- 호출 가능한 객체
- 보통 함수를 호출할 때, 아래와 같이 호출한다.
class Calculator2(object): def __init__(self, base): self.base = base
>>> cal2 = Calculator2(10)
>>> cal2.__call__(2,3)
15
하지만, 인스턴스 자체를 호출하기 위해 다음과 같이 __call__ 멤버함수를 추가한다.
__call__ 멤버함수를 선언하면, 인스턴스 호출 시 파이썬이 자동으로 __call__멤버함수를 호출해준다.
class Calculator2(object): def __init__(self, base): self.base = base def __call__(self,x,y): return self.base + x + y
>>> cal2 = Calculator2(10)
>>> cal2(1,2)
13
- 만일 상태값이 유지되는 함수를 사용하고 싶다면, 아래와 같이 사용하자.
class Calculator2(object): def __init__(self, base): self.base = base def __call__(self,x,y): self.base += x + y
return self.base
>>> cal2 = Calculator2(10)
>>> cal2(1,2)
13
>>> cal2(1,2)
16
- 클래스를 이용해 객체를 호출하는 것의 장점은 다음과 같다.
- 코드의 재사용성이 높아진다.
- 상속을 받아 중복되는 코드를 줄이고, 필요한 부분만 재정의해 사용할 수 있다.
- 문자열 수집
import requests from bs4 import BeautifulSoup from collections import Counter
class WordCount(object): def get_text(self, url): '문자열 수집' html = requests.get(url).text soup = BeautifulSoup(html, 'html.parser') return soup.text def get_list(self, text): '단어 리스트로 변환' return text.split()
def __call__(self, url): text = self.get_text(url) words = self.get_list(text) counter = Counter(words) return counter
- 문자열 수집 상속 후, 재활용
import re
class KoreaWordCount(WordCount): def get_list(self, text): '한글 리스트만 반환' words = text.split() print(words) return [word for word in words if re.match(r'^[ㄱ-힣]+$', word)] # list comprehension
웹 개발자가 알려주는 수익형 블로그 고속 성장 A to Z