예제:
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) 사용했지만, 카운터는 각 객체가 아닌 클래스에서 공통적으로 있어야 하므로 클래스 메서드여야 했습니다.
이야기
개발자는 클래스와 관련 없는 비즈니스 로직을 클래스 내부의 정적 메서드에 놓았습니다. 다른 사람들은 이 함수를 찾을 수 없었고, 다른 클래스의 공간에서 있을 것이라고 예상하지 않았기 때문에 유지보수가 복잡해졌습니다.