본문 바로가기

Python

[Python] 매직 메소드(special method)

오늘 파이썬 미니 특강이 있어서 듣던중에 매직 메소드라는 단어를 처음 들었다.

클래스에 대한 강의를 듣던 중에 나왔는데 매직 메소드에 대해서 자세히 찾아보았다.

 

매직 메소드

클래스에 정의된 함수를 메소드라고 부르는데 __로 시작해서 __로  끝나는 메소드 명을 가진 것들이다.

유명한 매직 메소드에는 __init__이 있는데 생성자라고 불리며 Class를 쓴다면 자주 볼 수 있다.

생성자는 클래스의 인스턴스가 생성될 때 자동으로 호출되는 메소드다.

정수, 실수, 문자열, 리스트, 딕셔너리, 튜플 등과 같은 데이터 타입 역시 클래스를 통해 만들어진 데이터들이다.

dir()은 어떤 객체를 인자로 넣어주면 해당 객체가 어떤 변수와 메소드(method)를 가지고 있는지 나열해주는데

예시로 딕셔너리를 담아서 출력해보면

d = {'a': 15, 'b': 634, 'c': 124, 'd': -436, 'e': -235, 'f': 856, 'g': 23, 'h': 523}
print(dir(d))
['__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__ior__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__ror__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 
'pop', 'popitem', 'setdefault', 'update', 'values']

 

라는 결과가  나오는 것을 볼 수 있다.

위의 결과는 딕셔너리 객체가 가지고 있는 변수들과 사용 할 수 있는 메소드들을 나열해준다.

 

__call__ 과 __getattribute__에 대해서

파이썬을 쓰다 보면 종종 함수에 ()를 붙이거나 .을찍어서 객체에 접근한다.

여기서 쓰이는 것들이 바로 매직 메소드인데

어떤 클래스(타입)의 객체가 있을 때 '( )'를 붙여주면 해당 클래스에 정의된 매직 메소드인 __call__이 호출되고,

변수가 어떤 객체를 바인딩하고 있을 때 점(.)을 찍으면 클래스의 __getattribute__ 라는 이름의 매직 메소드를 호출해 준다고 한다.

예제를 통해 살펴보면

class MyFunc:
    def __call__(self, *args, **kwargs):
        print("호출됨")


f = MyFunc()
f()


class Stock:
    def __getattribute__(self, item):
        print(item, "객체에 접근하셨습니다.")


s = Stock()
s.data

여기서  ()는 클래스  내의 __call__메소드를  호출해서 호출됨이라는 결과를 출력해주고
.은 클래스의 __getattribute__ 라는 메소드를 호출해서 결과를 출력해준다.

 

파이썬에 대해서 그냥 문법적으로만 암기하고 사용하고 있었는데

개발자에게 필요한 호기심이란 이렇게 깊게 파고들어 지식을 아는 것이라는 생각이 든다.

내가 사용하는 언어에 대해 호기심을 가지고 탐구는 능력이 필요한 것 같다.

'Python' 카테고리의 다른 글

[Python] Python MRO  (0) 2024.09.06
[Python] string 모듈에 대해서  (0) 2024.07.10
[Python] map, lambda  (0) 2024.07.08
[Python] Class에 대한 이해  (0) 2024.07.05
[Python] itertools 순열과 조합  (0) 2024.07.03