Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python

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

by
Length:ShortLanguages:

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
Advertisement
Advertisement
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.