본문 바로가기
[Language] - Python

#1. staticmethod, classmethod, instancemethod

by Bebsae 2020. 12. 9.

이번에는 파이썬의 메소드 3종류를 알아보겠다. @staticmethod, @classmethod 데코레이터를 메소드위에 작성하면 해당 메소드는 정적메소드로 분류된다. 데코레이터를 사용하지 않으면 instancemethod에 해당된다.

 

정적메소드는 인스턴스를 생성하지 않아도(않아야)호출이 가능하다.

반대로 인스턴스메소드는 인스턴스 생성이 필수이다.

 

자세한 내용은 코드를 보면서 이해하겠다.

 

1. @staticmethod

class A:
    num = 10

    @staticmethod
    def plus(x):
        return x + A.num

plus() 메소드의 return 값을 확인해보면 해당 메소드는 자신의 멤버(속성 및 메소드)를 참조할 방법이 없기 때문에 직접 클래스명(A.num)을 명시하여 num이라는 속성을 참조한 모습이다.

이는 좋지 못한 코드이다. 왜냐? 클래스명이 바뀌면 저렇게 A. 방식으로 참조한 모든 코드가 1억개가 넘는다고 상상해봐라. 직접 다 바꿀것인가?

 

2. @classmethod

class B:
    num = 10

    @classmethod
    def plus(cls, x):
        return x + cls.num

static의 단점을 보완한 형태(?)이다. plus() 메소드의 파라미터를 잘보면 cls(클래스)라는 것이 추가됬다. 이 cls는 자신(클래스)를 의미하며 자신의 멤버(속성 및 메소드)를 참조할 수 있다. 고로, return 값을 보아도 cls라는 키워드만으로 num을 참조할 수 있다. 이는 클래스명이 바뀌어도 동일하다.

 

3. 그렇다면 상속을 할 경우에는?

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이라는 결과가 나왔다.

 

4. instancemethod

class D:
    num = 10

    def plus(self, x):
        return x + self.num


class E(D):
    num = 20
    
    
d = D()
print(d.plus(10))

e = E()
print(e.plus(10))

인스턴스메소드는 정적메소드와 달리 키워드를 사용하지 않는다. 대신 self라는 키워드를 사용한다. cls와 마찬가지로 자기 자신의 멤버를 참조할 때 사용된다. 상속을 할 경우에도 위의 결과와 동일하다.

 

20
30

이로써 메소드의 종류 3가지와 cls, self 키워드에 대해 알아보았다. 

'[Language] - Python' 카테고리의 다른 글

#5. 덕 타이핑 (Duck Typing)  (2) 2020.12.29
#4. 추상 클래스 (Abstract Class)  (0) 2020.12.28
#3. pickle 모듈  (0) 2020.12.18
#2. 접근제한자 (Access Modifier)  (0) 2020.12.14
#0. args, kwargs  (0) 2020.12.09

댓글