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

Python 구식 클래스 vs 신식 클래스, 차이점 완벽 정리

Python 구식 클래스와 신식 클래스란?

Python 2.x에서는 내장 타입(built-in type)을 베이스 클래스로 상속하는지 여부에 따라 두 가지 스타일의 클래스가 공존했습니다. 이 차이를 이해하는 것은 Python 2 코드를 읽거나 유지보수할 때 매우 중요합니다.

1. 구식(Old Style) 클래스 — 클래식 스타일

구식 클래스는 어떤 내장 타입도 베이스 클래스로 갖지 않습니다.

>>> class OldSpam:          # 베이스 클래스 없음
...     pass
>>> OldSpam.__bases__
()

2. 신식(New Style) 클래스

신식 클래스는 내장 타입을 베이스 클래스로 가집니다. 즉, 직접적이든 간접적이든 항상 object를 조상으로 둡니다.

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

>>> class IntSpam(int):          # int를 통해 object를 간접 상속
...     pass
>>> IntSpam.__bases__
(<type 'int'>,)
>>> IntSpam.__bases__[0].__bases__   # int 역시 object를 상속
(<type 'object'>,)

왜 신식 클래스를 사용해야 할까?

클래스를 작성할 때는 항상 신식 클래스를 선택하는 것이 좋습니다. 그 이유는 신식 클래스가 훨씬 더 많은 강력한 기능을 지원하기 때문입니다.

디스크립터(Descriptor) 지원

신식 클래스는 디스크립터 프로토콜을 지원하며, 이를 통해 다음과 같은 핵심 구조들이 가능해집니다.

  • classmethod — 인스턴스가 아닌 클래스 자체를 암시적 첫 번째 인수로 받는 메서드입니다.
  • staticmethod — 암시적 인수 self를 전혀 받지 않는 메서드입니다.
  • property — 속성(attribute)의 조회(getting), 설정(setting), 삭제(deleting)를 관리하는 함수를 만들 수 있습니다.

그 외에도 신식 클래스는 super()를 통한 올바른 메서드 탐색 순서(MRO), __slots__, __new__ 등 다양한 고급 기능을 제공합니다.

Python 3.x에서는 어떻게 될까?

Python 3.x부터는 신식 클래스만 지원합니다. 클래스 선언 시 괄호 안에 object를 명시할 필요가 없으며, 모든 클래스가 자동으로 object를 상속받습니다.

# Python 3.x — object를 명시할 필요 없음
class Spam:
    pass

결론적으로, Python 2에서 새로운 클래스를 작성할 때는 반드시 object를 상속하는 신식 클래스로 작성하는 것이 모범 사례였으며, Python 3에서는 이러한 방식이 기본 동작으로 자리 잡았습니다.