Programming/Python

[Python] Type Class와 Meta Class

쌍쌍바나나 2016. 5. 23. 22:30
반응형

Python Type Class, Meta Class

  파이썬은 동적 바인딩 프로그래밍 언어입니다. 여기서 동적바인딩이란 프로그램 실행 중에 자료형과 함수의 타입이 결정되는 것을 말합니다. 즉 코딩을 할때 값이 어느 변수의 타입인지 할당이 되지 않고, 프로그램을 우리가 실제로 동작을 하는 동시에 자료형과 함수의 타입이 그때 그때마다 결정이 됩니다. 파이썬에서 하나의 장점이자 단점이 변수를 생성할때 type을 지정하지 않는것도 파이썬이 동적 바인딩 프로그래밍 언어라는 사실을 알 수 있습니다. 하지만 동적바인딩의 가장 단점은 타입이 정해져 있지 않기 때문에 정적 바인딩(사전에 자료형과 함수의 타입이 정해져있는)에 비해 실행 속도가 느립니다. 

  이번 글에서는 type class와 meta class에 대해서 설명하려고 합니다.

Type Class

  우리가 흔하게 변수의 type을 체크하려고 할때 많이 사용했었던, type이라는 클래스는 함수는 변수의 타입을 알수 있을 뿐만아니라, 새로운 클래스를 생성할 수 있습니다. 저도 type이라는게 하나의 메소드로서만 동작하는 줄 알았는데, 클래스였다는 사실에 놀랬습니다. type클래스는 아래와 같은 파라미터를 사용해 클래스를 생성할 수 있습니다. 

type(클래스, 부모클래스, 속성값을 정의하는 심볼 테이블)

  아래 예제는 superclass의 타입인 fruit를 생성하고, myclass의 타입인, name이 banana고, value가 like인 banana라는 객체를 생성했습니다. 이때 fruit과 다르게 banana에는 부모 클래스를 명시해 주었습니다. 이렇게 되면 fruit은 banana클래스의 부모 클래스가 되고, 즉 banana는 fruit에 상속(inheritance) 되었다고 표현합니다.

fruit = type("superclass", (), {}) 

banana = type("myclass", (fruit,), {'name':'banana', 'value':'like'})

print banana.name
# 'banana'
print banana.value
# 'like'


Meta Class

  메타클래스는 인스턴스(객체)를 갖는 클래스를 말한다. 즉, 인스턴스를 갖는 클래스이기 때문에  SingletonType을 사용할때 자주 사용되는 클래스 입니다. 최초 type클래스로 부터 상속을 받고, 객체를 갖는 클래스를 생성하기 위해 __metaclass__에 type으로 부터 상속받은 클래스를 명시해주면 됩니다. 이렇게 말하면 잘 이해가 안되기 때문에 한번 사용을 해보면 아 이런거구나... 라는 감이 오실겁니다. [Meta Class를 이용한 Singleton Pattern 만들기 바로가기]

class SingletonType(type):
    def __call__(cls, *args, **kwargs):
        try:
            return cls.__instance
        except AttributeError:
            cls.__instance = super(SingletonType, cls).__call__(*args, **kwargs)
            return cls.__instance
        
class CustomLogger(object):
    __metaclass__ = SingletonType 


더 좋은 의견이 있으시거나, 추가적으로 조언을 주시면 수정하겠습니다. 도움이 되셨다면, 작은 표시 하나 남겨주시면 더 좋은 글로 보답하겠습니다. 
감사합니다. :)

반응형