파이썬을 통해 다양한 클래스들을 생성하고 구현된 코드들을 보다보면 클래스마다 __에 의해 감싸진 특수한 메소드들을 많이 볼 수 있습니다. 이 때 각 메소드들이 어떤 함수인지 알고 코드를 보면 클래스에 구현된 함수들을 이해하거나 동작 방식을 이해할 때 도움이 될 것 같아 지금까지 AI 모델들의 코드들을 구현하며 많이 마주쳤던 특수한 메소드들을 정리해봅니다.
(사실 아주 기초적이지만 따로 찾아볼 생각은 안했어서 지금이라도 정리해봅니다..)
__init__요약: 클래스를 처음 호출할 때 자동으로 실행되는 메소드
예시
class Test:
def __init__(self,title):
self.title=title
self.title에 저장된다.실행 결과
T = Test("Happy New Year")
T.title #T를 지정할 때 넣은 title 인자에 맞게 지정되어 있음
>>> Happy New Year
__call__요약: 클래스를 함수처럼 쓸 수 있게 만들어주는 메소드
__call__ 을 이용하면 따로 동작을 위한 메소드를 만들지 않고 클래스의 인스턴스를 함수처럼 호출 할 수 있게 해줍니다.예시
class Test1:
def square(self,x):
return x**2
class Test2:
def __call__(self,x):
return x**2
__call__을 사용하지 않고 square이라는 메소드를 새로 생성해서 제곱을 반환합니다.__call__을 사용해 메소드를 추가로 생성하지 않고 제곱을 수행합니다.두 클래스에 대한 실행 결과는 아래와 같습니다.
T = Test1()
T.square(5)
>>> 25
T = Test2()
T(5) #추가적인 메소드를 쓰지 않고도 인스턴스를 함수처럼 사용 가능
>>> 25
__repr__요약: 문자열을 ‘return’하는 메소드
__repr__에 어떤 문자열을 반환할지 지정하면 print(클래스)를 통해 해당 문자열이 프린트 된다.예시
class Test:
def __init__(self):
self.title="Happy New Year"
def __repr__(self):
return self.title
self.title 에 문자열을 지정하고 __repr__ 을 통해 반환한다.실행결과
T = Test()
print(T.title)
>>> Happy New Year
print(T) #T.title과 같은 결과
>>> Happy New Year
T.title은 __init__함수에 의해 지정되어 “Happy New Year”를 반환하고, T는 __repr__에 의해 T.title과 동일한 결과를 반환하게 된다.__len__: 데이터셋의 길이를 반환합니다.__getitem__: index 값을 입력으로 받으며, 데이터셋에서 해당 index에 해당하는 값을 반환한다.__setitem__: index값과 지정할 데이터를 입력으로 받으며, 데이터셋에서 해당 index에 해당하는 값을 지정한 데이터로 변환한다.__delitem__: index값을 입력으로 받으며, 데이터셋에서 해당 index에 해당하는 값을 제거한다.예시
len(x) x.__len__()
x[a] x.__getitem__(a)
x[a] = v x.__setitem__(a,v)
del x[a] x.__delitem__(a)
이 함수들은 클래스에 지정하는 것이 아닌, 클래스의 어트리뷰트(Attribute)들을 관리하는 함수이다. 파이썬에 기본적으로 내장되어 있으며 다양한 코드 구현에서 활용되어 정리한다.
getattr(obj,"name") : obj.name를 반환hasattr(obj,"name"): obj.name이 있는지 확인delattr(obj,"name"): obj.name을 삭제setattr(obj,"name",value): obj.name을 value로 변환실행 결과
getattr(T,'title') #T.title 확인
>>> 'Happy New Year'
hasattr(T,'title') #T.title 유무 확인
>>> True
setattr(T,'title',"Merry Christmas") #T.title 변환
getattr(T,'title')
>>> "Merry Christmas"
delattr(T,"title") #T.title 제거
hasattr(T,'title')
>>> False
간단하지만 쉽게 보고 지나쳤던 메소드들이지만 이렇게 정리해보고 나니 앞으로 코드를 구현하거나 읽을 때 좀 더 편하게 쓸 수 있을 것 같습니다. 많은 참고가 되셨으면 좋겠습니다.