Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 클래스는 어떻게 object를 상속할까? 구식 클래스와 신식 클래스 완벽 정리

파이썬에서 클래스를 정의하면 내부적으로 object와 어떤 관계를 맺게 될까요? 이 질문에 답하려면 파이썬 버전별로 클래스 스타일이 어떻게 달라졌는지 이해해야 합니다.

파이썬 2.x: 두 가지 클래스 스타일

파이썬 2.x에서는 기반 클래스(base class)로 내장 타입을 사용하는지 여부에 따라 두 가지 스타일의 클래스가 존재했습니다.

1. 구식(Old-style) 또는 클래식(Classic) 클래스

구식 클래스는 내장 타입을 기반 클래스로 갖지 않는 클래스입니다. 다음 예시처럼 클래스 이름 뒤에 아무것도 명시하지 않으면 구식 클래스가 됩니다.

>>> class OldFoo:      # 기반 클래스 없음
...     pass
>>> OldFoo.__bases__
()

__bases__ 속성을 확인해 보면 빈 튜플 ()이 반환되는데, 이는 어떤 클래스도 상속하지 않았다는 의미입니다.

2. 신식(New-style) 클래스

신식 클래스는 내장 타입을 기반 클래스로 가지는 클래스입니다. 즉, 직접적이든 간접적이든 object를 조상으로 두는 클래스를 말합니다.

>>> class NewFoo(object):   # object를 직접 상속
...     pass
>>> NewFoo.__bases__
(<type 'object'>,)

클래스 선언 시 (object)를 명시적으로 적어주면 신식 클래스가 되며, __bases__에는 object 타입이 포함된 것을 확인할 수 있습니다.

파이썬 3.x: 신식 클래스만 존재

파이썬 3.x부터는 신식 클래스만 허용됩니다. 모든 클래스가 자동으로 내장 타입인 object를 기반으로 하기 때문입니다.

따라서 파이썬 3에서는 클래스 선언 시 클래스 이름 뒤 괄호 안에 object를 적어줄 필요가 없습니다. 클래스는 암묵적으로 object를 상속받습니다.

>>> class Foo:      # object를 직접 상속하는 것과 동일
...     pass
>>> Foo.__bases__
(<class 'object'>,)

object를 명시하지 않았음에도 Foo.__bases__를 확인하면 object가 기반 클래스로 자동 설정된 것을 볼 수 있습니다.

정리

  • 파이썬 2.x: 기반 클래스 유무에 따라 구식 클래스와 신식 클래스가 공존했습니다. 신식 클래스를 만들려면 (object)를 명시해야 했습니다.
  • 파이썬 3.x: 모든 클래스가 암묵적으로 object를 상속하는 신식 클래스로 통일되었습니다.

현재 파이썬 3만 사용한다면 object 상속을 고민할 필요가 없지만, 레거시 코드나 파이썬 2 호환성을 다룰 때는 이 차이를 반드시 알아두어야 합니다. 특히 구식 클래스는 다중 상속에서 메서드 결정 순서(MRO) 문제나 super() 미지원 등의 한계가 있었기에, 신식 클래스 도입은 파이썬 객체 모델의 중요한 개선점이었습니다.