여니의 Side Project/인프런 - 리프 (파이썬 고급)

[인프런 리프 대학생 2기] 3주차(1) | Chapter 3. Meta Class

여니's 2021. 3. 26. 20:45


Meta Class(1)

 

메타 클래스의 역할

- 클래스를 만드는 클래스이다.

메타 클래스를 구현하는 방법은 총 2가지

1. type을 사용해서 동적으로 클래스 생성

2. type을 상속받아서 메타클래스를 구현하는 방법

 


클래스의 정확한 의미부터 알아보면,

대부분의 언어에서의 클래스는

어떻게 객체를 생성할지 정의하는 역할을 수행한다.

 

하지만,

파이썬에서는 이보다 더 큰 의미를 가진다.

** 파이썬에서는 클래스를 객체로 생각한다 **

 

클래스를 객체로 생각하면 뭐가 좋은가..?

객체이면 다양한 속성과 행동들을 부여할 수 있게 된다.

 

- 클래스는 그 자체로 새로운 객체(인스턴스)를 만들 수 있다.

- 클래스는 객체니까 출력도 가능하다.

- 클래스를 함수의 인자로 넘길수 있다.

- 클래스에 새로운 속성을 추가할 수도 있다

.- 클래스를 변수에 할당할 수 있다.

 

클래스는 객체니까,

함수 내에서도 클래스(객체)를 만들 수 있다.

 

물론 함수만으로 관리할 수 있지만,

프로그램의 크기가 커지게 되면

데이터를 효율적으로 관리할 수 없게 되고

그리 하여 나온 개념이 클래스!

 


 

다시 Meta class로 돌아와서,

메타 클래스는 의도하는 방향으로

클래스를 커스텀 하는 역할을 수행한다.

그리고 동적 생성도 가능하고,

커스텀 생성도 물론 가능하다

 

 

런타임시 클래스 자체가 메모리에 할당된다.

 

클래스를 인스턴스화하는 방법은!?

변수명 = 클래스명()

 

위 코드에서 보면,obj1은 SampleA의 인스턴스이고,

SampleA 클래스는 type meta class이며,

type 클래스는 type meta class 즉, 자기 자신을 가리킨다.

 

모든 클래스의 메타는 type 클래스!!

type 클래스를 조작할 수 있다면,

필요한 클래스를 만들어낼 수 있다.

 

참고로, int 자체도 클래스이다.

파이썬에 존재하는 자료구조는 클래스로 변환돼서 실행된다.

 

type(obj1) == obj1.__class__

 


Meta Class(1)

type()으로 동적 클래스 생성하기

type(name,base,dct)

: type은 3 개의 인자를 받는다.

 

name은 클래스 이름,

base는 상속되는 클래스,

dct는 속성, 메소드

동적 클래스는

s1= type('sample1',(),{})

type()을 이용해서 생성한다.

=> sample1이라는 클래스를 동적으로 생성하는 과정인 것이다.

 

s1.__base__

> 결과값 <class 'object'>

>> 클래스는 object 클래스를 상속 받는다.

 

정적 클래스랑 동적 클래스랑 차이가 뭘까..?

보기엔 정적 클래스가 더 편한데,,

이유에 대해 찾아보고

답을 알게 되면 아래 부분에 추가해둘게요 :)

혹시 이유에 대해 아시는 분,,, 있으시면

댓글 남겨주시면 감사하겠습니다..

 

 

## ##

메모리 영역의 차이가 있다.

정적 메모리 할당프로그램 컴파일 시 메모리가 할당된다.스택은 정적 할당을 구현할 때 사용함

 

동적 메모리 할당런타임에 메모리가 할당된다.힙은 동적 할당을 구현하는 데 사용한다.

 

(1) 스택 영역

- 프로세스의 메모리 공간을 관리하기 위한 알고리즘

- 함수 안에서 선언된 지역 변수, 매개변수, 리턴값, 돌아올 주소 등이 저장되고,

호출 시 기록하고 종료되면 제거한다.

- 컴파일 타임에 크기가 결정되기에 무한할당이 불가하다.

- 재귀함수가 너무 깊게 호출되거나와 같은 이유등으로

스택 영역이 초과되면 오버플로우 발생

 

(2) 힙 영역

- 힙영역은 런타임에 결정된다

- 배열의 크기가 확실하지 않고, 변동이 있을 때 heap 영역을 활용

- 사용하고 난 다음 반드시 해제를 해야 한다.

- 스택보다 할당할 수 있는 메모리 공간이 많지만, 속도가 느리다는 단점이 있다. 

 


동적 생성 + 상속

type(s2) -> type

types2.__base__ -> parent1

parent1s1.__dict__ -> {'attr1': 100, 'attr2': 'hi', '__module__': '__main__', '__doc__': None}

 


동적으로 메서드 생성하기

sample3라는 클래스를 동적으로 생성한다.

dict (속성, 메서드) 입력하면 된다.

 

 

※ self

> 클래스의 인스턴스를 나타내는 변수


Meta Class(3)

 

메타 클래스 상속

커스텀 메타클래스 생성하기

기본적인 커스터마이제이션 -> docs.python.org/ko/3.7/reference/datamodel.html#special-method-names

 

3. 데이터 모델 — Python 3.7.10 문서

클래스는 특별한 이름의 메서드들을 정의함으로써 특별한 문법 (산술 연산이나 인덱싱이나 슬라이딩 같은)에 의해 시작되는 어떤 연산들을 구현할 수 있습니다. 이것이 연산자 오버 로딩 (operato

docs.python.org

__new__

: 클래스의 새 인스턴스를 만들기 위해 호출된다.

실제 객체를 만들고 반환한다.

 

__init__

: 인스턴스가 __new__에 의해 만들어진 후, 호출된다

 

__call__

: 인스턴스가 함수처럼 호출될 때 호출된다.

 

클래스명(type): -> type을 상속받는 것!

 

super()...?

super()은 자식 클래스에서 부모 클래스의 내용을 사용하고자 할 때 사용

 

super().__call__(*args,**kwargs) 

>> 부모클래스의 __cal__메소드 호출


강의명 : 모두를 위한 파이썬

inf.run/JmKS

 

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

폭넓은 파이썬 개발 경험, 온오프라인 수업 경험을 바탕으로 파이썬 메타프로그래밍, 깊이있는 문법을 다루기 위한 과정입니다. 더 나아가 파이썬 취준생 면접 및 경력자분들의 기술면접에도

www.inflearn.com