Python Tricks - 클래스 작성에 도움이 될 내용
이 글은 댄 베이더의 Python Tricks를 읽고 쓰는 글입니다.
현재 협업에서는 대부분 Airflow를 이용한 함수 형태의 Dag 개발이 대부분이지만, 플랫폼이나 모듈 개발에는 클래스로 작성하기 때문에 도움이 될 것 같아 정리합니다.
1. __repr__ 정의하기
__repr__() 함수에 대해서는 파이썬 객체 내부 함수들에 대해서 공부하면서 __str__() 함수와 함께 공부했었습니다. 하지만 추가적으로 알게 된 내용과 팁에 대해 조금 더 적어보겠습니다.
__str__() 함수가 정의 되지 않았다면, __repr__를 출력한다.
위 소주제가 바로 최소한 __repr__의 정의가 필요하다는 이유이기도 합니다. 보통 클래스를 그대로 출력하면 클래스 이름과 함께 객체가 메모리에서 차지하는 주소값이 출력됩니다.
하지만, 우리가 알고 싶은 내용은 주소값보다 어떤 데이터로 초기화 되어 있는지? 와 같이 현재의 상태값일 가능성이 높습니다. 이 경우에는 디버깅에도 상당히 도움이 될 가능성도 높습니다.
그렇기 때문에 저자는 최소환 __repr__ 함수를 우리가 원하는 클래스 내용을 출력하도록 권장합니다.
2. 예외를 만들어서 사용하기
대부분의 경우 파이썬의 예외는 Exception 클래스를 상속받은 클래스로 만들어져 있지만, 문제는 광범위하게 그 의미를 가지기 때문에 문제를 특정하기가 어렵다는 점입니다.
그럴때는 명확하게 발생하는 예외에 대해서 클래스 이름으로 그 예외의 설명을 대신하면 디버깅이 쉬워진다는 점을 저자는 말하고 있습니다.
3. ABC 클래스를 이용한 추상화
중요합니다. 사실 모듈 개발외에는 자주 사용하지 않았지만, ABC 클래스를 잘 활용하여 추상화하는 것은 객체지향 프로그래밍의 기본입니다.
4. 네임드 튜플의 사용
무조건적으로 사용을 권장하는 내용은 아닙니다. 하지만 __init__으로 초기 값을 설정하는 클래스와 유사하게 동작할 수 있으면서 입력 될 변수 명을 고정하여 변경 불가능한 객체로 만들어주는 것은 상당히 괜찮은 기능입니다.
클래스와 같이 상속을 받으면 동일한 고정된 형태에서 동일한 함수를 다르게 동작하도록 만들 수 있습니다. 사실 클래스로 만들 것 같은데, 네임드 튜플은 코드가 확실히 간결해서 사용하는게 좋을 수 있겠네요.
5. 클래스 변수와 인스턴스 변수를 명확히 구분하자
이 부분은 새롭게 알게되었고, 아마 앞으로 활용 할 수 있을 것이라 생각되어 정리합니다.
class Dog:
num_legs = 4
def __init__(self, legs):
num_legs = legs
다음과 같은 클래스가 있을 때 다음과 같은 정의문으로 Dog 클래스의 오브젝트를 만들 수 있습니다.
dog = Dog(6)
이렇게 만들어졌을때 우리는 객체의 변수를 dog.num_legs와 같은 방식으로 접근하게 되는데, 이 경우 접근하는 변수는 인스턴스 변수입니다. 클래스 변수는 클래스의 이름만으로 접근이 가능하며, 객체에 귀속되지 않습니다.
이렇게 접근하면 클래스 변수를 얻을 수 있습니다.
dog.__class__.num_legs