프로그래밍백엔드 개발자

파이썬의 클래스 데코레이터란 무엇입니까? 클래스를 수정하거나 기능을 추가하는 데 어떻게 사용할 수 있습니까? 예를 제시하고 가능한 주의사항에 대해 설명하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

클래스 데코레이터는 클래스를 인수로 받아들이고 수정된 클래스 또는 완전히 새로운 클래스를 반환하는 함수입니다. 이를 통해 메서드를 동적으로 추가하거나 기존 메서드의 동작을 변경하거나 심지어 원본 클래스의 기능을 확장하는 서브클래스를 반환할 수 있습니다.

가장 간단한 클래스 데코레이터의 예:

def add_repr(cls): def __repr__(self): return f'<{cls.__name__}: {self.__dict__}>' cls.__repr__ = __repr__ return cls @add_repr class Point: def __init__(self, x, y): self.x = x self.y = y p = Point(3, 4) print(p) # <Point: {'x': 3, 'y': 4}>
  • 데코레이터 add_repr는 적용된 모든 클래스에 동적으로 메서드 __repr__를 추가합니다.

주의사항:

  • 클래스 데코레이터는 클래스에 대한 내부 감싸기뿐만 아니라 완전히 감싸진 클래스(예: 프록시 클래스나 상속자)를 반환할 수도 있습니다.
  • 클래스 인스턴스를 생성할 때 사용되는 *args**kwargs 인수를 지원하지 않는 경우 오류가 발생할 수 있습니다.

함정 질문.

클래스 데코레이터를 연속으로 두 번 적용하면 어떤 일이 발생합니까? 항상 적용 순서가 명확합니까?

답변:

데코레이터는 "아래에서 위로" 적용됩니다: 먼저 클래스 선언 바로 위에 있는 데코레이터가 적용되고, 다음으로 위에 있는 것이 차례로 적용됩니다. 순서는 매우 중요합니다. 첫 번째 데코레이터의 결과가 두 번째 데코레이터에 전달됩니다.

@dec1 @dec2 class Test: ... # 이는 다음과 같습니다: # Test = dec1(dec2(Test))

주제에 대한 미숙지로 인한 실제 오류 사례.


이야기

e-커머스 애플리케이션에서 클래스의 메서드를 로깅하려고 했지만, 데코레이터에서 잘못된 객체를 반환하여 메서드가 클래스 속성을 잃어버려 상속이 올바르게 작동하지 않아 모델이 망가졌습니다.


이야기

자동으로 새로운 메서드를 생성하기 위해 프로젝트에서 추가하는 데코레이터를 사용했지만 서브클래스를 반환할 때 super()를 잊어버렸습니다. 그 결과 계층 구조와 MRO가 깨져 기본 클래스 호출이 자식에서 작동하지 않게 되었습니다.


이야기

데이터 파이프라인에서 여러 개의 데코레이터(로거, 변경 추적기)로 클래스를 감싸려고 했지만 잘못된 적용 순서로 인해 메서드 이름 충돌이 발생하여 "잃어버린" 메서드 때문에 프로덕션에서 버그가 발생했습니다.