문제
다음 Python 코드의 실행 결과를 쓰시오.
Pythonclass MetaValidator(type): def __new__(cls, name, bases, attrs): if name != 'BaseValidator': attrs['validation_count'] = len([attr for attr in attrs if not attr.startswith('_')]) attrs['base_count'] = len(bases) attrs['total_score'] = attrs['validation_count'] * attrs['base_count'] * 10 return super().__new__(cls, name, bases, attrs) class BaseValidator(metaclass=MetaValidator): pass class SingleValidator(BaseValidator): def check_format(self): pass def validate_length(self): pass class MultiValidator(BaseValidator, object): def verify_syntax(self): pass def check_encoding(self): pass def validate_structure(self): pass print(SingleValidator.total_score) print(MultiValidator.total_score)
정답
20 60
2060
해설
메타클래스 MetaValidator의 new 메서드가 클래스 생성 시 동적으로 속성을 설정한다. SingleValidator는 2개의 메서드(check_format, validate_length)와 1개의 베이스 클래스(BaseValidator)를 가지므로 total_score = 2 * 1 * 10 = 20이다. MultiValidator는 3개의 메서드(verify_syntax, check_encoding, validate_structure)와 2개의 베이스 클래스(BaseValidator, object)를 가지므로 total_score = 3 * 2 * 10 = 60이다. BaseValidator는 name이 'BaseValidator'이므로 동적 속성 생성 로직을 건너뛴다.