https://stackoverflow.com/questions/111234/what-is-a-callable
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/
'Python_programming' 카테고리의 다른 글
[Python] " side effect (부수 효과) " 에 대한 고찰 (0) | 2021.05.16 |
---|---|
[Python] 함수(function)와 메서드(method)의 차이점 (0) | 2021.05.16 |
'정보 은닉'에 대한 고찰 (0) | 2021.05.09 |
Python 생성자(__new__)에 대한 고찰 (0) | 2021.04.22 |
Python self 에 대한 고찰 (0) | 2021.04.22 |