문제
다음 Python 코드의 실행 결과를 쓰시오.
Pythonclass Meta(type): def __new__(cls, name, bases, dct): if len(bases) > 1: dct['priority'] = sum(getattr(base, 'priority', 0) for base in bases) else: dct['priority'] = 1 return super().__new__(cls, name, bases, dct) class A(metaclass=Meta): value = 10 class B(metaclass=Meta): value = 20 class C(A, B, metaclass=Meta): pass class D(C, metaclass=Meta): pass print(A.priority) print(B.priority) print(C.priority) print(D.priority)
정답
1 1 2 1
1
1
2
11 1 2 1
해설
메타클래스 Meta의 new 메서드가 클래스 생성 시 호출되어 priority 속성을 동적으로 설정한다.
- A: bases가 비어있으므로(len(bases) = 0 ≤ 1) priority = 1
- B: bases가 비어있으므로(len(bases) = 0 ≤ 1) priority = 1
- C: A, B를 다중 상속하므로(len(bases) = 2 > 1) priority = A.priority + B.priority = 1 + 1 = 2
- D: C만 상속하므로(len(bases) = 1 ≤ 1) priority = 1 메타클래스의 new 메서드는 각 클래스가 정의될 때마다 실행되어 해당 클래스의 bases 길이에 따라 priority를 새로 계산하여 설정한다.