본문 바로가기
Python Object-oriented Programming

Metaclass

by 자동매매 2023. 4. 1.

Introduction to the Python Metaclass

 

메타 클래스는  다른 클래스를 만드는 클래스입니다. 기본적으로 Python메타클래스 type 을 사용하여  다른 클래스를 만듭니다.

예를 들어, 다음은 Person  클래스를 정의합니다.

 

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

 

파이썬은 코드를 실행할 type 메타 클래스를 사용하여 Person 클래스를 만듭니다. 이유는 Person 클래스가 기본적으로 메타 클래스 type 사용하기 때문입니다.

명시적인 Person 클래스 정의는 다음과 같습니다.

 

class Person(object, metaclass=type):
    def __init__(self, name, age):
        self.name = name
        self.age = age

 

metaclass 인수를 사용하면 클래스를 정의하는데 사용할 메타클래스 클래스를 지정할 있습니다.

따라서 다른 클래스를 만드는 자체 논리가 있는 사용자 지정 메타클래스를 만들 있습니다. 사용자 지정 메타 클래스를 사용하여 클래스 생성 프로세스에 기능을 삽입할 있습니다.

 

Python metaclass example

 

먼저 freedom 속성이 기본적으로 True 설정된 Human이라는 사용자 지정 메타 클래스를 정의합니다.  

 

class Human(type):
    def __new__(mcs, name, bases, class_dict):
        class_ = super().__new__(mcs, name, bases, class_dict)
        class_.freedom = True
        return class_

__new__ 메서드는 클래스 또는 클래스 개체를 반환합니다.

 

둘째, Human 메타 클래스를 사용하는 Person 클래스를 정의합니다.

 

class Person(object, metaclass=Human):
    def __init__(self, name, age):
        self.name = name
        self.age = age

 

Person클래스는 클래스 변수에 표시된 대로 freedom 속성을 갖습니다.

 

pprint(Person.__dict__)

 

Output:

 

mappingproxy({'__dict__': <attribute '__dict__' of 'Person' objects>,
              '__doc__': None,
              '__init__': <function Person.__init__ at 0x000001E716C71670>,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'Person' objects>,
              'freedom': True})

 

전체 code

 

from pprint import pprint


class Human(type):
    def __new__(mcs, name, bases, class_dict):
        class_ = super().__new__(mcs, name, bases, class_dict)
        class_.freedom = True
        return class_


class Person(object, metaclass=Human):
    def __init__(self, name, age):
        self.name = name
        self.age = age


pprint(Person.__dict__)

 

Metaclass Parameters

 

매개 변수를 메타클래스에 전달하려면 키워드 인수를 사용합니다. 예를 들어, 다음은 키워드 인수를 허용하는 Human 메타 클래스를 재정의하며, 여기서 인수는 클래스 변수가 됩니다.

 

class Human(type):
    def __new__(mcs, name, bases, class_dict, **kwargs):
        class_ = super().__new__(mcs, name, bases, class_dict)
        if kwargs:
            for name, value in kwargs.items():
                setattr(class_, name, value)
        return class_

 

다음은 Human 메타 클래스를 사용하여 country, freedom 클래스 변수가  각각 USA True 설정된 Person 클래스를 만듭니다.

 

class Person(object, metaclass=Human, country='USA', freedom=True):
    def __init__(self, name, age):
        self.name = name
        self.age = age

 

Here are Person class variables:

 

pprint(Person.__dict__)

 

Output:

 

mappingproxy({'__dict__': <attribute '__dict__' of 'Person' objects>,
              '__doc__': None,
              '__init__': <function Person.__init__ at 0x0000018A334235E0>,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'Person' objects>,
              'country': 'USA',
              'freedom': True})

 

전체 Code

 

from pprint import pprint


class Human(type):
    def __new__(mcs, name, bases, class_dict, **kwargs):
        class_ = super().__new__(mcs, name, bases, class_dict)
        if kwargs:
            for name, value in kwargs.items():
                setattr(class_, name, value)
        return class_


class Person(object, metaclass=Human, freedom=True, country='USA'):
    def __init__(self, name, age):
        self.name = name
        self.age = age


pprint(Person.__dict__)

 

When to use metaclasses

 

실제로 Django 같은 대규모 프레임 워크의 핵심을 유지하거나 개발하지 않는 메타 클래스를 사용할 필요가 없습니다.

 

Summary

  • 메타 클래스는 다른 클래스를 만드는 클래스입니다.

'Python Object-oriented Programming' 카테고리의 다른 글

Property Decorator  (0) 2023.04.01
Metaclass Example  (0) 2023.04.01
type Class  (0) 2023.04.01
Abstract Class  (0) 2023.03.31
super() Method  (0) 2023.03.31

댓글