Python/파이썬 오픈소스 배포

메타 클래스 (2)

monstro 2025. 7. 5. 01:59
728x90
반응형

- 개요

type 함수를 호출하여 메타 클래스를 사용하면 사용자가 설계한 방식으로 동작하는 동적 클래스를 생성할 수 있다

이때 생성하기 위해 사용하는 인자는 다음과 같다

  • Name : 동적으로 생성할 클래스 이름
  • Bases : 동적으로 생성할 클래스가 상속받을 클래스들, 튜플로 지정한다
  • Dct : 동적으로 생성할 클래스의 어트리뷰트와 메서드들, 딕셔너리로 지정한다

 

위와 같이 메타 클래스를 통해 생성한 동적 클래스들사용자가 정의한 방식으로 동작하므로

필요한 기능만을 가져와 사용하는 라이브러리와 다르게 고유한 동작흐름이 있는 프레임워크에서 매우 유리하다

 

 1) 동적 클래스의 생성

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

print(s1)           
print(type(s1))     
print(s1.__base__)  
print(s1.__dict__)

 

type 함수를 통해 동적 클래스 SampleA를 생성하였다

상속받을 클래스프로퍼티 및 메서드는 따로 지정하지 않았다

 

동적 클래스를 저장한 변수 s1으로부터 동적 클래스의 정보를 출력한다

알아볼 정보는 각각 다음과 같다

  • 해당 클래스의 이름과 메모리 주소를 나타내는 문자열
  • 해당 클래스의 type
  • 해당 클래스의 부모 클래스
  • 해당 클래스의 구성요소를 담은 딕셔너리

 

 

실행 결과는 위와 같다

메인 모듈의 동적 클래스 SampleA가 제일 먼저 출력되었고,

SampleA 클래스의 메타 클래스 type이 출력되었다

이어서 파이썬에서 클래스의 조상 클래스인 object가 출력되고 이어서 정보를 담은 딕셔너리가 출력되었다

 

2) 클래스를 상속받은 동적 클래스 생성

class Parent1:
    pass

s2 = type('Child1', (Parent1,), dict(attr1=100, attr2='Hi'))
print(s2)           
print(type(s2))     
print(s2.__base__)  
print(s2.__dict__)  
print(s2.attr1, s2.attr2)

 

이번에는 1)의 예제와 다르게 type 함수에 클래스를 인자로 넘겨주어 동적 클래스의 부모를 설정하였다

동적 클래스의 어트리뷰트도 인자로 넘겨주어 두 개의 어트리뷰트를 추가하였다

따라서 출력하고자 하는 정보에 추가한 두 개의 어트리뷰트도 포함시킨다

 

 

1)의 예제와 다른 부분부모 클래스가 object가 아닌 Parent1 클래스라는 점

추가한 어트리뷰트의 값이 문제없이 확인된다는 점이다

 

3) 메서드가 포함된 동적 클래스 생성

s3 = type(
        'Sample2',
        (),
        dict(attr1=30, attr2=100,add=lambda x, y : x + y, multiple=lambda x, y : x * y )
    )

print(s3)                                   
print(type(s3))                             
print(s3.__base__)                          
print(s3.__dict__)                          
print(s3.attr1, s3.attr2)                   
print(s3.add(s3.attr1, s3.attr2))           
print(s3.multiple(s3.attr1, s3.attr2))

 

마지막 예제에서는 동적 클래스에 메서드를 추가한다

함수를 정의한뒤에 추가하는 것도 가능하지만,

일시적인 람다를 사용하면 메모리 효율을 아낄 수 있다

 

출력하는 정보에서는 2)의 예제와 다르게 동적 클래스에 추가한 두개의 메서드를 수행한 결과를 출력한다

 

 

출력된 결과는 위와 같다

추가한 두개의 메서드가 문제없이 동작하여

동적 클래스의 어트리뷰트로 연산을 수행한 것을 확인할 수 있다

728x90
반응형

'Python > 파이썬 오픈소스 배포' 카테고리의 다른 글

Descriptor (1)  (0) 2025.07.07
메타 클래스 (3)  (0) 2025.07.05
메타 클래스 (1)  (0) 2025.07.04
메서드 오버로딩  (0) 2025.07.02
메서드 오버라이딩  (0) 2025.07.01