본문 바로가기

Python_programming

'callable object' 에 대한 고찰

https://stackoverflow.com/questions/111234/what-is-a-callable

 

What is a "callable"?

Now that it's clear what a metaclass is, there is an associated concept that I use all the time without knowing what it really means. I suppose everybody made once a mistake with parenthesis, res...

stackoverflow.com

 

object is not callable  이란 문구이자 에러를 파이썬 프로그래밍을 하다 보면 한 번쯤은 보게 된다.

콜러블은 그냥 소괄호가 () 있어야 되는 것 정도로만 알고 넘어가는 경우가 있는데 이에 대한 개념을 정리해보자.

 

callable함수, 클래스 인스턴스, 메서드 등이 호출 가능한지 점검하는 함수이다.

호출이 가능하면 True 의 결과값을 전달한다. 

파이썬에는 callable 내장함수가 있다. 이 함수는 스폐셜 메서드인 __call__ 메서드의 존재 유무를 확인한다.

이 메서드가 존재하면 True 이다.

 

callable 을 구현한 것과 하지 않은 2가지 객체를 만들보자.

 

1. callable 구현한 클래스

 

class CallInstance:
    def __init__(self,name):
        self.name = name
    
    def __call__(self):
        print("  call 메서드 ")
        return self.name

 

 

2. callable 구현하지 않은 클래스

 

class Instance:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    

 

 

정의된 클래스로 인스턴스를 생성하고  내장함수 callable 을 이용해서 callable 객체 유무를 판단해보겠습니다.

 

 

 

 

스폐셜 메서드인 __call__  의 정의 유무에 따라 calllable 의 유무를 확인할 수 있습니다. 

 

콜러블 객체의 유무는 '__call__' 메서드의 유무입니다. 그러면 작동할 때는 ?

작동할 때는 콜러블은 소괄호 "()" 를 사용하면 작동합니다.  그래서 가끔 어떤 메서드명 뒤에 소괄호 입력 하거나 안했을 때 콜러블이다 아니다 이런 에러가 나오는 것입니다. 

 

처음에 언급한 스택오버플로우의 예시로 살펴보겠습니다. 

이번에는 아래처럼 __call__ 메서드 하나만을 구현한 클래스를 만듭니다.

 

 

class Foo:
    def __call__(self):
        print('call 작동!')

 

 

그리고 인스턴스를 만든 뒤, 소괄호를 실행하면 __call__ 메서드가 작동되는 것을 볼 수 있습니다.

 

 

 

 

 

하나 더, 예시를 만들어보겠습니다.

 

 

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    def __call__(self,major):
        return print(self.name + "의 전공은 " + major + "입니다." )

 

__call__ 메서드를 만들었으니 소괄호를 사용해보죠.

 

 

 

정리해보겠습니다.

 

1. 파이썬에서 callable 객체는 어떤 메서드가 있어야 성립되는가?

 

__call__ 메서드

 

2. call 스폐셜 메서드가 정의된 경우 사용할 때 뭘 쓰는가? 

 

소괄호를 쓴다. 이 때, call 스폐셜 메서드에서 정의한 매개변수를 채워서 작동시킴에 유의하자.

 

 

이 정도로 callable 객체에 대한 이해를  마무리 하겠습니다.

 

 

** 저의 정리에는 언제나 오류가 들어 있을 수 있습니다. 혹시라도 그게 보인다면 댓글로 정정 언급해주시면 감사하겠습니다. **

 

## 참고 블로그 ##

 

https://frhyme.github.io/others/callable_object/

 

callable object? callable 객체?

callable object? callable 객체?

frhyme.github.io