4-1. Meta Class(1)

3주차 강의는 메타데이터 ( + Descriptor ) 를 다루었다. 정말 극강의 난이도였다..
강사님의 말씀을 분명 들었는데, 그대로 한쪽 귀로 빠져나가서 몇번을 돌려봤는지 모르겠다. 🤯

강사님께서도 메타 클래스를 도대체 왜 배우는 것인지 알 수 없었던 때가 있으셨고, 실제로 메타 클래스에 대한 개념을 익히는 시간이 꽤 오래 걸리셨다고 한다.

그런데 이 개념에 대해서 배우고나서 직접 코딩을 하면서 파이썬에 대한 훨씬 깊은 이해를 할 수 있게 되었고, 다른 언어를 배울 때도 이해력이 폭 넓게 증가했다고 한다.

3주차 강의를 마친 나의 생각도 같다!
개념만 익혔을 뿐인데, 이젠 다른 오픈 소스의 코드가 조금은 읽힌다.
매직 메소드도 더 이상 두렵지 않다 🥳


Mata Class

  • 오늘의 키워드
    • Class of Class
    • type function
    • meta class
    • custom meta class

메타 클래스 대체 왜 쓰는거죠? 🤔

1. 클래스를 만드는 역할을 한다.

내가 의도하는 방향으로 클래스를 커스텀(⭐️)하겠다.
즉, 구현 레벨에 개입이 가능하다.

2. 프레임워크 작성 시 필수로 알아두어야 한다.

Spring, Flux, MSA, tensorflow, pytorch, Django 등 많은 오픈소스 프레임워크에서
메타 클래스로 접근해서 코드를 수정하고 있다.
이런 프레임워크를 직접 사용하고, 다른 개발자들과 협업하기 위해선 반드시 메타 클래스를 알아야한다.


메타 클래스 어디에 쓰는거죠? 🤔

1. 커스텀 클래스를 만들어서 우리가 원하는 방향으로 흘러가고 있는지 검증할 수 있게 된다.

2. 엄격한 클래스를 사용 요구할 때 쓰인다.

뼈대를 메타 클래스로 탄탄하게 만들어 놓고, 오픈 소스로 커스터마이즈 하는 방향으로 쓰인다.
Django도 DB와 클래스를 1:1로 매핑하기 때문에 엄격하다.


메타 클래스 어떻게 만드는데요? 🤔

type 함수가 동적 생성과 커스텀 클래스 생성을 가능하게 한다.

type

특정 인스턴스의 자료형을 출력함과 더불어, 메타 클래스를 생성할 수 있다.

class SamlpleA(): 
    pass

obj1 = SamlpleA() 

print('ex 1>',obj1.__class__)
#  <class '__main__.SamlpleA'> 
# obj1의 원형은 sampleA라고 알려준다.

print('ex 1>',type(obj1))
# obj1의 타입 또한  '<class __main__.SamlpleA'> 이다.

type의 역할

type 💬 "너 어디에서 만들어졌어?"

  • 인스턴스가 어디에서 만들어졌는지 출력해준다.

class SampleA로 만들어진 인스턴스 obj1의 type은 '<class __main__.SamlpleA'> 이다.

⭐️ 그렇다면 class SampleA누구로부터 만들어진걸까?

obj1.__class__ 는 SampleA 이므로,
obj1.__class__.__class__ 로 알 수 있을 것이다.

print('ex 1>',obj1.__class__.__class__)
# <class 'type'>

띠용? 뜬금없이 type이 출력되었다.

사실 파이썬에서 모든 클래스의 메타 클래스는 type이다.
type이 모든 클래스의 원형 인 것이다. 😮

type의 type

⭐️ 그렇다면 type은 누구로부터 만들어졌을까?

print('ex 1>',obj1.__class__.__class__)
# ex 1> <class 'type'>

print('ex 1>',type(obj1).__class__)
# ex 1> <class 'type'>

print('ex 1>',type.__class__)
# ex 1> <class 'type'>

놀랍게도 type은 자기 자신이 메타다.
이미 파이썬 언어 자체에 정의된 내용이기 때문에, type에 대한 메타는 개입할 수가 없다!
그렇지만 다른 객체의 메타 클래스는 언제든 개입 가능하므로 내 입맛대로 커스텀 해보자~!


핵심 정리 ⭐️

obj1 = SampleA's instance
SampleA = type meta class
type = type meta class

  • 모든 클래스의 메타는 type이다.
  • type자기자신이 메타이다.
    그래서 type에 대한 메타는 개입할 수 없다.

[출처]

인프런 - 모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original)

좋은 웹페이지 즐겨찾기