Python은 클래스 정의에서 세 가지 유형의 메서드를 지원합니다: 인스턴스 메서드, 클래스 메서드 및 정적 메서드. 이들은 호출 방식과 클래스 및 인스턴스 데이터에 대한 접근 방식에 따라 다릅니다.
이력:
처음에 인스턴스 메서드(‘self’가 있는)가 유일한 동작 유형으로, 메서드는 항상 특정 객체의 동작을 호출하거나 데이터를 수정/읽는 것으로 이해되었습니다. 이후 Python에는 클래스 전체에 대한 동작을 제공하는 클래스 메서드(‘cls’가 있는)와 일반 함수와 유사하나 클래스와 관련된 정적 메서드가 추가되었습니다.
문제:
때로는 모든 인스턴스에 대한 공통 기능이 필요합니다(정적 메서드). 때때로 작업은 "클래스 전체에 대해" 사용할 수 있어야 합니다(예: 인스턴스 생성). 이때 메서드 유형을 잘못 정의하면 버그를 발생시킬 수 있습니다(예: 인스턴스 메서드를 통해 클래스를 변경하려고 시도하거나 그 반대의 경우).
해결:
코드 예:
class MyClass: def instance_method(self): return f"인스턴스: {self}" @classmethod def class_method(cls): return f"클래스: {cls}" @staticmethod def static_method(): return "이것은 정적 메서드입니다" obj = MyClass() print(obj.instance_method()) # 인스턴스: <MyClass object...> print(MyClass.class_method()) # 클래스: <class 'MyClass'> print(MyClass.static_method())# 이것은 정적 메서드입니다
주요 특징:
클래스를 통해 인스턴스 메서드를 직접 호출할 수 있나요?
가능하지만 객체를 명시적으로 전달해야 합니다:
MyClass.instance_method(obj)
이것은 드물게 적합합니다.
상속 시 정적 메서드의 동작: 재정의할 수 있습니까?
예, 자식 클래스에서 동일한 이름으로 staticmethod를 선언할 수 있으며, 상속자에서 호출할 때 해당 메서드가 호출됩니다.
cls를 인수로 사용하여 언제든지 정적 메서드를 사용할 수 있는 경우 클래스 메서드는 무엇에 사용됩니까?
cls는 첫 번째 인수일 뿐만 아니라, classmethod에서 Python은 호출이 자식 클래스에서 발생하더라도 이에 해당하는 클래스를 cls로 자동으로 대입합니다. 이는 부모에 대한 강한 연결 없이 대체 생성자 계층을 구축할 수 있게 합니다.
예:
class Base: @classmethod def make(cls): return cls() class Child(Base): pass Child.make() # Base가 아닌 Child를 반환합니다.
프로젝트에서 대체 인스턴스를 생성하기 위해 일반 메서드가 사용되었습니다(예: create_from_json). 이로 인해 상속 시 메서드는 항상 기본 클래스 객체를 반환했으며, 자식 객체를 반환하지 않았습니다.
장점:
단점:
현재 클래스 인스턴스를 반환하는 classmethod 팩토리가 구현되었습니다(cls()), 심지어 자식 클래스에서 호출되더라도.
장점:
단점: