반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- error
- 분당맛집
- ubuntu
- CLASS
- 티스토리챌린지
- 터미널
- GPT
- 딥러닝
- tensorflow
- socketio
- Android
- linux
- 오블완
- 스팸
- TTS
- CUDA
- Torch
- openAI
- string
- 맛집
- pytorch
- ROS2
- ChatGPT
- python
- no space left on device
- 판교
- humble
- opencv
- timm
- ros
Archives
- Today
- Total
RoBoLoG
[Python] 파이썬의 메타클래스(MetaClass) 본문
메타클래스란?
메타클래스는 클래스의 클래스입니다. 즉, 메타클래스는 클래스를 생성하고 정의하는 데 사용되는 클래스입니다. 일반적으로 클래스는 객체의 템플릿을 정의하고, 메타클래스는 클래스의 템플릿을 정의합니다. 메타클래스는 클래스 생성 과정에 개입하여 추가적인 로직을 수행할 수 있게 해줍니다. 이를 통해 클래스의 동작을 동적으로 변경하거나 클래스 정의 시점에 특정 작업을 자동화할 수 있습니다.
코드 예시
import functools
def method_logger(func):
# 메소드 호출 전후에 로그를 출력하는 데코레이터 함수 정의
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
print(f"Logging: {func.__name__} 호출 시작")
result = func(self, *args, **kwargs)
print(f"Logging: {func.__name__} 호출 종료")
return result
return wrapper
class LoggingMeta(type):
# 모든 메소드에 로깅 기능을 추가하는 메타클래스 정의
def __new__(cls, name, bases, dict):
# 클래스의 모든 메소드를 순회
for attr_name, attr_value in dict.items():
if callable(attr_value):
# 메소드를 로깅 데코레이터로 래핑
dict[attr_name] = method_logger(attr_value)
return type.__new__(cls, name, bases, dict)
class MyClass(metaclass=LoggingMeta):
# LoggingMeta 메타클래스를 사용하는 샘플 클래스 정의
def method1(self):
print("메소드 1 실행")
def method2(self, value):
print(f"메소드 2 실행: {value}")
- LoggingMeta 메타클래스의 __new__ 메서드가 호출됩니다. 이 메서드는 MyClass가 정의될 때 실행됩니다. 이 메서드는 MyClass에 정의된 모든 메소드를 순회하고, 각 메소드를 method_logger 데코레이터 함수로 래핑합니다.
instance = MyClass()
- MyClass의 인스턴스를 생성합니다. 이 과정에서 메타클래스는 직접적으로 관여하지 않습니다.
instance.method1()
- instance.method1()을 호출하면, 먼저 method_logger에 의해 "Logging: method1 호출 시작"이 출력되고, 실제 메소드 method1이 실행되어 "메소드 1 실행"이 출력됩니다. 그 후 "Logging: method1 호출 종료"가 출력됩니다.
instance.method2(100)
- instance.method2(100)을 호출하면, 비슷한 과정으로 "Logging: method2 호출 시작", "메소드 2 실행: 100", 그리고 "Logging: method2 호출 종료"가 순서대로 출력됩니다.
728x90
반응형
'Study > Python' 카테고리의 다른 글
[Python] 파이썬 os.path.exists에 대한 모든것 (0) | 2024.01.23 |
---|---|
[Python] 파이썬에서 List 사용 예시 (0) | 2024.01.17 |
[Python] 디스크립터 (descriptor) (0) | 2024.01.09 |
[Python] Wrapper란 무엇인가? (0) | 2024.01.09 |
[Python] 클래스 만들 때 super().__init__() 사용하는 이유? + 부모 클래스가 2개 이상인 경우 (2) | 2024.01.08 |