파이썬에는 세 가지 주요 유형의 메서드가 있습니다: 인스턴스 메서드, 클래스 메서드 및 정적 메서드. 역사적으로 파이썬은 인스턴스 메서드(첫 번째 매개변수 self)만 지원했습니다. 시간이 지나면서 객체에 대한 바인딩 없이 클래스에서 접근할 수 있는 추가 유형의 메서드와 클래스 자체에 접근할 수 있는 메서드의 필요성이 생겼습니다.
문제: 종종 객체의 인스턴스 상태에 의존하지 않는 메서드를 만들거나(예: 팩토리 메서드) 아예 클래스의 맥락이 필요 없지만 논리적으로 클래스 구조에 포함되는 메서드를 생성해야 할 필요가 있습니다.
해결책: @classmethod 및 @staticmethod 데코레이터가 사용됩니다.
코드 예:
class Example: def instance_method(self): return f'instance: {self}' @classmethod def class_method(cls): return f'class: {cls}' @staticmethod def static_method(): return 'static'
주요 특징:
정적 메서드가 클래스 및 인스턴스의 속성에 접근할 수 있습니까?
아니요, 정적 메서드는 클래스나 객체에 대한 참조를 받지 않습니다.
class A: x = 10 @staticmethod def f(): # print(self.x) # 오류 pass
클래스 메서드는 자식 클래스에서 재정의 될 수 있습니까?
네, 자식 클래스를 통해 호출된 classmethod는 첫 번째 인수로 항상 실제 클래스가 되고 부모 클래스가 아닙니다.
class Base: @classmethod def name(cls): return cls.__name__ class Child(Base): pass Child.name() # "Child"
클래스 메서드에 대해 self를 사용할 수 없는 이유는 무엇입니까?
클래스 메서드는 특정 객체가 아니라 클래스 전체와 연결되어 있기 때문입니다. self는 인스턴스를 생성하지 않으면 접근할 수 없습니다.
팩토리 메서드를 staticmethod로 정의하고 내부에서 self를 통해 클래스 인스턴스를 만들려고 하면 오류나 코드 중복이 발생합니다.
장점:
단점:
팩토리는 classmethod로 선언되고, 내부에서 인스턴스를 생성하기 위해 실제 클래스(cls)를 사용합니다. 파생 클래스는 이 팩토리를 통해 올바르게 생성됩니다.
장점:
단점: