2026.04.13 - [Python] - Python - Class , __init__

 

__call__ 는 파이썬 클래스의 특수 메서드로, 클래스의 인스턴스(생성된 객체)를 함수처럼 호출가능하게 만들어줌

 

보통 객체.메서드() 형태로 기능을 실행함. 그런데 __call__을 정의하면 객체()와 같이 이름뒤에 괄호를 붙여 "바로" 실행가능

 

__call__함수를 안쓴경우  아래처럼 Class내의 메서드를 실행시킨다.

 

class Dog:
    name = "Sally"
    species = "Mixed"
    def display_Dog(self) :
        print(f"name is {self.name}, species is {self.species}")

dog1=Dog()
dog1.display_Dog()
>>>
name is Sally, species is Mixed

 

__call__함수를 통해 메서드를 정의하면, 아래와 같이 호출 가능

class Dog:
    name = "Sally"
    species = "Mixed"

    # 메서드 이름을 __call__로 변경
    def __call__(self):
        print(f"name is {self.name}, species is {self.species}")

dog1 = Dog()

# dog1.display_Dog() 대신 dog1()으로 바로 호출 가능
dog1()
>>>
name is Sally, species is Mixed

 

일반 메서드를 사용하는 것 보다는 코드가 간결해진다. 하지만, 호출시 무슨일이 일어나는지에 대해서는 클래스를 확인해야하는 번거로움이 있다.

 

그럼 언제 __call__을 쓰는게 좋을까?

위의 예시처럼 단순한 정보를 출력하는 경우에는 display_Dog()처럼 이름을 명시하는게 더 코드 이해에 좋을것이다.

하지만

 

주요 동작이 하나인경우, 클래스의 목적이 오직 한가지 동작을 수행하는 것일때, 

 

class CelsiusToFahrenheit:
    def __init__(self, precision=2):
        self.precision = precision

    def __call__(self, celsius):
        # 섭씨를 화씨로 변환하는 공식: (C * 9/5) + 32
        fahrenheit = (celsius * 9/5) + 32
        return round(fahrenheit, self.precision)

# 변환기 객체 생성 (소수점 1자리까지 표시 설정)
converter = CelsiusToFahrenheit(precision=1)

# 객체를 마치 함수처럼 사용하여 온도 변환
print(converter(25))    
>>> 77.0
print(converter(36.5)) 
>>> 97.7

 

함수처럼 다뤄야 할 때: 다른 함수의 인자로 인스턴스를 넘겨줘야 하는데, 그 함수가 내부적으로 f() 형태의 호출을 기대할 때.

 

class ThresholdFilter:
    def __init__(self, threshold):
        self.threshold = threshold

    def __call__(self, value):
        # 기준값보다 큰 데이터만 True 반환
        return value > self.threshold

# 데이터 리스트
data = [10, 25, 5, 40, 15]

# 1. 기준이 20인 필터 객체 생성
filter_20 = ThresholdFilter(20)

# 2. filter() 함수에 인스턴스를 인자로 전달
# filter 함수는 내부적으로 f(value) 형태의 호출을 기대함
result = list(filter(filter_20, data))

print(result) 
>>> [25, 40]

 

'Python' 카테고리의 다른 글

Python - Class , __init__  (0) 2026.04.13
Python - lambda함수  (0) 2026.04.13

+ Recent posts