7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Python

간단한 팁: 파이썬의 메타클래스란 무엇인가?

Scroll to top
Read Time: 3 mins

Korean (한국어) translation by Dae-yeop Lee (you can also view the original English article)

이 팁에서는 파이썬에서 메타클래스가 의미하는 바를 간략하게 설명하고 이 개념의 예제를 몇 가지 보여드리겠습니다.

이 기사를 살펴보기에 앞서 메타클래스의 개념을 좀 더 쉽게 이해할 수 있도록 파이썬의 클래스에 관한 중요한 점을 지적하겠습니다.

파이썬에서는 클래스가 객체일까요?!

파이썬이 아닌 다른 프로그래밍 언어를 사용해본 적이 있다면 클래스라는 개념이 새로운 객체를 만드는 데 사용되는 방법이라고 이해했을 가능성이 높습니다. 이것은 파이썬에서도 마찬가지입니다. 하지만 파이썬은 한 단계 더 나아가 클래스도 객체로 간주합니다.

그래서 파이썬에서 다음과 같은 클래스를 만들었다면

이것은 단순히 myClass라는 이름의 객체가 메모리에 만들어졌음을 의미합니다. 이 객체는 새 객체를 만들 수 있으므로 클래스로 간주됩니다. 이것은 클래스 자체가 객체이기 때문에 파이썬에서는 클래스에 객체 연산을 적용할 수 있음을 의미합니다.

따라서 다음과 같이 클래스를 변수에 할당하는 것과 같은 클래스에 대한 작업을 수행할 수 있습니다.

위 코드는 다음과 같은 결과를 반환합니다.

다음과 같이 myClass 클래스를 매개변수로 메서드에 전달할 수도 있습니다.

위 코드는 다음과 같은 결과를 반환합니다.

다른 연산도 일반적으로 객체에 적용할 수 있습니다.

메타클래스

아마 파이썬에서 type 키워드를 본 적이 있을 것입니다. 다음 예제에서처럼 어떤 객체의 타입을 확인하는 데 사용했을 가능성이 큽니다.

이 경우 다음과 같은 결과가 출력됩니다.

출력 결과를 살펴보면 type 타입이 오기 전까지는 모든 것이 꽤 명확해 보입니다. 이것이 무슨 뜻인지 알기 위해 이 글의 도입부에서 정의한 클래스로 돌아가 봅시다.

이제 다음 코드를 실행합니다.

이 문장은 어떤 결과를 출력할까요? 놀랍게도 다음과 같이 출력될 것입니다.

따라서 파이썬에서 클래스의 타입은 type이라고 결론내릴 수 있습니다!

typemetaclass 간의 관계는 무엇일까요? 기본 metaclasstype인 경우 typemetaclass입니다. 이게 무슨 말인지 혼란스러울 수도 있다는 것을 알고 있습니다. 특히 앞에서 보여준 것과 같이 어떤 객체의 클래스를 반환하는 데 type을 사용할 수 있는 경우가 그렇지만 이는 파이썬의 하위 호환성 때문입니다. 그래서 다음과 같이 작성하면

다음과 같은 결과가 출력됩니다.

즉, typetype이라는 뜻입니다!

metaclass라는 용어는 단순히 클래스를 만드는 데 사용되는 것을 의미합니다. 즉, 메타클래스는 클래스의 클래스이며, 이 경우 클래스의 인스턴스가 클래스라는 것을 의미합니다. 따라서 type의 인스턴스가 클래스이기 때문에 typemetaclass로 간주됩니다.

예를 들어, 위에서 다음 문장을 언급했을 때

이것은 단순히 myClass 클래스의 객체/인스턴스를 만듭니다. 다시 말해, 클래스를 사용해 객체를 생성한 것입니다.

같은 방법으로 다음과 같이 했을 때

metaclassmyClass 클래스(type으로 간주되는)를 만드는 데 사용됐습니다. 따라서 객체가 클래스의 인스턴스인 것처럼 클래스는 metaclass의 인스턴스입니다.

메타클래스를 사용해 클래스 만들기

이번 절에서는 클래스와 객체 튜토리얼에서 본 것처럼 class 문을 사용하는 대신 metaclass를 사용해 클래스를 만드는 방법을 살펴보겠습니다. 위에서 봤듯이 기본 metaclasstype입니다. 따라서 다음과 같은 문장을 사용해 새 클래스를 만들 수 있습니다.

더 단순하게 만들고 싶다면 myClass라는 동일한 클래스 이름을 변수 이름에 할당하면 됩니다.

여기서는 클래스의 속성을 정의하는 데 { } 딕셔너리를 사용했습니다. 따라서 다음과 같은 문장은

다음 코드와 비슷합니다.

__metaclass__ 속성

다음과 같이 myClass 클래스를 만들었다고 해봅시다.

이 경우 클래스 생성은 다음과 같이 type 대신 myMetaClass를 이용해 이뤄집니다.

메타클래스의 생성과 초기화

클래스가 생성된 후 클래스를 생성하고 초기화하는 방법을 제어하려면 메타클래스의 __new__ 메서드와 __init__ 생성자를 각각 사용하면 됩니다. 그래서 위의 myMetaClass가 호출되면 내부적으로 다음과 같은 일들이 일어납니다.

이번 팁을 길게 만들지 않고 싶지만 요약하자면 클래스를 만들기 위해  파이썬에서는 metaclass가 사용된다고 결론 내릴 수 있습니다. 즉, metaclass의 인스턴스는 클래스입니다. 메타클래스에 대해 좀 더 깊이 알고 싶다면 이 튜토리얼을 참고하세요.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.