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 |
댓글