프로그래밍Python 개발자

파이썬에서 클래스 메서드(@classmethod), 정적 메서드(@staticmethod) 및 인스턴스 메서드의 차이에 대해 설명하십시오. 어떤 경우에 무엇을 선택해야 합니까?

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

답변.

  • 인스턴스 메서드 — 첫 번째 인수로 self를 받아 특정 객체에 대한 참조를 갖습니다. 객체의 상태를 접근/수정하는 데 사용됩니다.
  • @classmethod는 첫 번째 인수로 cls를 받으며 객체가 아닌 클래스 자체에 대한 참조입니다. 공장 메서드 또는 클래스 전체와 작업하는 메서드에 사용됩니다.
  • @staticmethod는 암시적인 인수를 전혀 받지 않습니다. 클래스 내부에 배치된 일반 함수로, 논리적 그룹화를 위해 사용됩니다.

예제:

class MyClass: def instance_method(self): print(f"인스턴스: {self}") @classmethod def class_method(cls): print(f"클래스: {cls.__name__}") @staticmethod def static_method(): print("그냥 함수") obj = MyClass() obj.instance_method() # self는 obj입니다 MyClass.class_method() # cls는 MyClass입니다 MyClass.static_method() # self/cls는 없습니다

함정이 있는 질문.

자주 묻는 질문:

인스턴스를 통해 클래스 메서드를 호출할 수 있습니까? 클래스 자체를 통해 호출하는 것과 어떤 차이가 있습니까?

답변: 네, 클래스 메서드는 인스턴스를 통해서도 호출할 수 있고, 클래스 자체를 통해서도 호출할 수 있습니다. 호출이 어디에서 이루어지든지 첫 번째 인수는 항상 인스턴스가 아닌 클래스가 됩니다. 인스턴스를 통해 호출할 때 cls로 해당 클래스가 전달됩니다.

이 주제의 세부 사항을 몰라서 발생한 실제 오류의 사례.


이야기

프로젝트에서 모든 공장 메서드를 정적 메서드(@staticmethod)로 만들었지만 내부에서 자식 클래스의 이름을 알 필요가 있었습니다 — 이것이 불가능하게 되었습니다. cls 참조를 얻기 위해 @classmethod로 수정했습니다.


이야기

인스턴스의 고유 ID를 생성하기 위해 인스턴스 메서드(self) 사용했지만, 카운터는 각 객체가 아닌 클래스에서 공통적으로 있어야 하므로 클래스 메서드여야 했습니다.


이야기

개발자는 클래스와 관련 없는 비즈니스 로직을 클래스 내부의 정적 메서드에 놓았습니다. 다른 사람들은 이 함수를 찾을 수 없었고, 다른 클래스의 공간에서 있을 것이라고 예상하지 않았기 때문에 유지보수가 복잡해졌습니다.