클래스 심화
1. 클래스 메서드와 정적(static) 메서드
Python의 클래스에는 일반적인 인스턴스 메서드 외에도 클래스 메서드와 정적(static) 메서드라는 두 가지 특별한 유형의 메서드가 있습니다. 이들 메서드는 @classmethod
와 @staticmethod
데코레이터를 사용하여 정의됩니다.
1.1 클래스 메서드 (@classmethod
)
클래스 메서드는 클래스에 작용하는 메서드입니다. 클래스 메서드는 첫 번째 인자로 클래스 자체를 받습니다. 일반적으로 이 인자를 cls
로 명명합니다. 클래스 메서드는 클래스 상태를 변경하는 데 사용될 수 있습니다.
1.2 정적(static) 메서드 (@staticmethod
)
정적(static) 메서드는 클래스나 인스턴스와는 독립적으로 작동하는 메서드입니다. 정적 메서드는 self
나 cls
같은 특별한 첫 번째 인자를 받지 않습니다. 정적 메서드는 주로 클래스와 연관은 있지만 인스턴스나 클래스 상태에는 접근하지 않는 메서드에 사용됩니다.
아래와 같이 과목에 관련된 클래스를 만들었다고 했을 때 academic_warning에서는 self를 이용한 접근이 되지 않습니다.
2. 속성 접근자와 덕 타이핑
2.1 속성 접근자 (Property)
Python에서는 @property
데코레이터를 사용하여 클래스의 메서드를 속성처럼 접근할 수 있게 만들 수 있습니다. 이를 통해 객체의 내부 상태를 보호하고, 특정 속성에 대한 접근을 제어할 수 있습니다.
이 클래스의 인스턴스에서 full_name
속성에 접근하면, _first_name
과 _last_name
을 합친 문자열을 반환합니다. @property
데코레이터가 없다면, full_name()
메서드를 직접 호출해야 합니다.
2.2 속성 접근자의 값 설정
@property
데코레이터를 사용하면, 속성에 값을 할당할 때 setter 메서드를 사용할 수 있습니다. setter 메서드는 @property
데코레이터와 동일한 이름을 사용하며, @property
데코레이터의 이름 뒤에 .setter
를 붙여 정의합니다. 이를 통해 속성에 대한 값을 설정할 때 추가적인 검증을 수행할 수 있습니다.
2.3 덕 타이핑 (Duck typing)
"오리처럼 걷고, 오리처럼 꽥꽥대면 그것은 오리다."는 덕 타이핑의 원리를 잘 나타내는 문장입니다.
Duck Typing - 'If it walks like a duck and it quacks like a duck, then it must be a duck’
Duck typing덕 타이핑은 실제 타입은 상관치 않고 구현된 메서드로 확인하는 방법입니다. 좀 더 어려운 말로 객체의 변수 및 메서드의 집합이 객체의 타입을 결정하는 개념을 의미합니다. 이를 통해 유연한 인터페이스를 구현할 수 있습니다.
위 코드에서 quack(obj)
함수는 obj
가 실제로 Duck 타입이든 아니든 상관하지 않고, quack
메서드를 호출합니다. 이러한 접근법은 런타임에 메서드나 속성의 존재를 확인하기 때문에 코드가 더욱 유연해집니다.