반응형
파이썬을 다루다보면 __call__함수에 직면하는 경우가 생깁니다.
저와 같은 데이터 사이언티스트의 경우에는 __call__함수는 Tensorflow의 def call() 메서드나 PyTorch의 def forward() 메서드가 대표적이라고 할 수 있는데요.
인스턴스를 생성하고 자동으로 클래스의 객체도 호출할 수 있게 만드는 기능입니다.
아래처럼 리스트를 받아 난수 10개를 뿌려주는 난수생성기 클래스로 표현되었다고 생각해봅시다.
인스턴스 메서드 구현
아래처럼 pick 메서드를 활용할 때, 출력물이 생성되고, 10개의 난수를 담은 리스트가 리턴되는 것을 확인할 수 있습니다.
import random
class RandomNumberReturn:
def __init__(self):
self.numbers = [n for n in range(1, 101)]
def pick(self):
print('1. Before shuffling -->>> ', self.numbers)
random.shuffle(self.numbers)
print('2. After shuffling -->>> ', self.numbers)
return sorted([random.choice(self.numbers) for _ in range(10)])
if __name__ == '__main__':
randnum = RandomNumberReturn()
print(randnum.pick())
# 출력물
# 1. Before shuffling -->>> [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, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
# 2. After shuffling -->>> [19, 62, 73, 18, 13, 40, 77, 46, 74, 98, 71, 12, 88, 93, 76, 9, 45, 75, 58, 97, 34, 20, 29, 38, 87, 35, 61, 89, 17, 85, 5, 23, 1, 59, 84, 37, 91, 68, 53, 44, 94, 2, 26, 21, 64, 16, 81, 70, 3, 48, 57, 32, 30, 25, 50, 86, 4, 56, 33, 66, 79, 55, 11, 96, 6, 28, 90, 24, 7, 8, 14, 92, 51, 10, 95, 83, 52, 31, 49, 39, 60, 27, 15, 65, 54, 80, 41, 69, 82, 72, 42, 43, 99, 67, 78, 47, 36, 100, 22, 63]
# return 값: [16, 19, 20, 23, 23, 38, 60, 89, 90, 98]
이때 __call__함수가 어떻게 활용될 수 있을까요?
간단하게 클래스 내 메서드 하나만 정의해주면 됩니다.
def __call__(self):
print('Special Method __call__ is called!!!!!!!!')
return self.pick()
이제 확인해보겠습니다.
class RandomNumberReturn:
def __init__(self):
self.numbers = [n for n in range(1, 101)]
def pick(self):
# print('1. Before shuffling -->>> ', self.numbers)
random.shuffle(self.numbers)
# print('2. After shuffling -->>> ', self.numbers)
return sorted([random.choice(self.numbers) for _ in range(10)])
def __call__(self):
print('Special Method __call__ is called!!!!!!!!')
return self.pick()
if __name__ == '__main__':
randnum = RandomNumberReturn() # 랜덤넘버 인스턴스 생성
print(randnum()) # call 매직메서드를 이용한 객체 호출
print(randnum.pick()) # 정상적인 방법으로 인스턴스의 메서드 호출
print(callable(randnum)) # __call__ 활용 가능한지? 즉 콜러블 객체인지 True/False로 확인
# ---- 출력물 ----
# randum() 이 호출되었을 때, 결과
# Special Method __call__ is called!!!!!!!!
# [9, 20, 28, 31, 35, 43, 47, 52, 71, 74]
# randnum.pick() --- (인스턴스 메서드)를 통해 호출되었을 때 결과
# [6, 16, 28, 33, 35, 63, 69, 74, 80, 82]
# True
반응형
'파이썬 > 클래스' 카테고리의 다른 글
[python] 클래스 메서드(class method)와 정적 메서드(static method) (0) | 2023.03.08 |
---|---|
[python] 파이썬 Class 내 self.<variable name>에서 self 키워드는 어떤 역할을 할까? (0) | 2023.03.05 |
파이썬과 객체지향 (python and class) 3 - 생성자(__init__, initializer) (0) | 2023.01.02 |
파이썬과 객체지향 (python and class) 2 (0) | 2023.01.02 |
파이썬과 객체지향 (python and class) 1 (0) | 2023.01.02 |