개요
이번에는 파이썬의 메소드 3종류를 알아보겠다. @staticmethod, @classmethod 데코레이터를 메소드 위에 작성하면 해당 메소드는 정적 메소드로 분류된다. 데코레이터를 사용하지 않으면 instancemethod에 해당된다. 정적 메소드는 인스턴스를 생성하지 않아도 호출이 가능하다. 즉, self 키워드를 사용하지 않아도 정의할 수 있으며, 인스턴스가 아닌 클래스 자체에 종속된 멤버이다.
@staticmethod
class A:
num = 10
@staticmethod
def plus(x):
return x + A.num
- plus() 메소드의 return 값을 확인해보면 해당 메소드는 자신의 멤버(속성 및 메소드)를 참조할 방법이 없기 때문에 직접 클래스명(A.num)을 명시하여 num이라는 속성을 참조한 모습이다.
@classmethod
class B:
num = 10
@classmethod
def plus(cls, x):
return x + cls.num
- plus() 메소드의 파라미터를 잘보면 cls(클래스)라는 것이 추가됬다. cls 키워드는 자신(클래스)를 의미하며 자신의 멤버(속성 및 메소드)를 참조할 수 있다. 고로, return 값을 보아도 cls라는 키워드만으로 num을 참조할 수 있다. 이는 클래스명이 바뀌어도 동일하다.
- staticmethod에서는 자신을 참조할 때 클래스명을 직접 입력했다면, classmethod는 cls 키워드로 참조할 수 있기 때문에 클래스명이 바뀌어도 변화에 대해 닫혀있다.
그렇다면 상속을 할 경우에는?
class B:
num = 10
@classmethod
def plus(cls, x):
return x + cls.num
class C(B):
num = 20
print(B.plus(10))
print(C.plus(10))
- C라는 클래스가 B클래스를 상속받았다. 이러한 경우에 C.plus()에 존재할 cls는 B일까 C일까?
20
30
- 정답은 C이다. C클래스에서는 num을 20으로 오버라이딩 한 상태이다. 그러나 C클래스의 cls키워드가 B클래스를 가르킨다면 오버라이딩과 관계없이 B클래스의 num을 사용하여 20이라는 결과가 나왔을 것이다. 그러나 cls는 부모 클래스가 아닌 자기 자신을 참조한다. 고로 C클래스의 num을 사용하여 30이라는 결과가 나왔다.
instancemethod
class D:
num = 10
def plus(self, x):
return x + self.num
class E(D):
num = 20
d = D()
print(d.plus(10)) # 20
e = E()
print(e.plus(10)) # 30
- 인스턴스 메소드는 정적 메소드와 달리 키워드를 사용하지 않는다. 대신 self라는 키워드를 사용한다. cls와 마찬가지로 자기 자신의 멤버를 참조할 때 사용된다. 상속을 할 경우에도 위의 결과와 동일하다.
- 정적 메소드와의 차이점이라면, 인스턴스 메소드는 클래스가 아닌 클래스로부터 파생된 각각의 고유한 객체에 종속적이다. 고로, 인스턴스마다 다른 멤버 변수(__init__ 초기화자에 선언된 인스턴스 필드)를 가지고 있으면 self 키워드를 통해 참조하게 된다. (인스턴스를 초기화해야 호출할 수 있는 이유이기도 하다.)
'[Language] - Python' 카테고리의 다른 글
| 덕 타이핑 (Duck Typing) (2) | 2020.12.29 |
|---|---|
| 추상 베이스 클래스 (Abstract Base Class) (0) | 2020.12.28 |
| pickle 모듈 (0) | 2020.12.18 |
| 접근제한자 (Access Modifier) (0) | 2020.12.14 |
| 가변인자 args, kwargs (0) | 2020.12.09 |