Big Ben
Big Ben's Log
Big Ben
전체 방문자
오늘
어제
  • 전체 글 (80)
    • 파이썬 (23)
      • 파이썬 기초 (5)
      • 클래스 (6)
      • 자료구조 (4)
      • Tensorflow (3)
      • PyTorch (2)
      • konlpy (1)
      • anaconda (1)
    • 머신러닝 (3)
      • 선형회귀 (1)
      • Tree 기반 (1)
    • 딥러닝 (6)
      • NLP (2)
      • VISION (2)
      • TABULAR (0)
      • 딥러닝 서버 구축 (2)
    • 그래프 이론 (1)
      • 그래프마이닝 (1)
      • GNN (0)
    • 강화학습 (3)
      • 강화학습 기본 (3)
    • 인공지능 (5)
    • 추천시스템 (2)
      • 추천시스템 기초 (2)
    • Competitions (1)
    • 빅데이터 (8)
      • 하둡 (3)
      • 스파크 (4)
      • 클라우드 (1)
    • SQL (7)
      • MariaDB (2)
    • 논문 리뷰 (2)
    • 대학원 (0)
      • 데이터 사이언스 (0)
      • 경제학 (0)
    • 선형대수학 (7)
      • 선형대수 ICE BREAKING (1)
      • 벡터 (5)
      • 고윳값 (1)
    • 개인프로젝트 (0)
      • 포트폴리오 대시보드 + AI기반 주식 자동매매 (0)
    • 재테크 (1)
    • 자동차 (0)
    • 알고리즘 (11)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 데이터사이언스
  • 파이썬
  • MariaDB
  • TensorFlow
  • mysql
  • 머신러닝
  • 코테
  • 선형대수
  • 데이터베이스
  • 하둡
  • 프로그래머스
  • Baekjoon
  • 빅데이터
  • PYTHON
  • 데이터
  • 파이썬기초
  • pytorch
  • 인공지능
  • class
  • AI
  • 객체
  • 백준
  • 프로그래밍
  • 코딩테스트
  • sql
  • 선형대수학
  • 딥러닝
  • 객체지향
  • 자료구조
  • 알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Big Ben

Big Ben's Log

파이썬/클래스

[python] 파이썬 class의 __call__ 함수 (매직메소드)

2023. 3. 12. 21:17
반응형

파이썬을 다루다보면 __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
    '파이썬/클래스' 카테고리의 다른 글
    • [python] 클래스 메서드(class method)와 정적 메서드(static method)
    • [python] 파이썬 Class 내 self.<variable name>에서 self 키워드는 어떤 역할을 할까?
    • 파이썬과 객체지향 (python and class) 3 - 생성자(__init__, initializer)
    • 파이썬과 객체지향 (python and class) 2
    Big Ben
    Big Ben
    Data Scientist

    티스토리툴바