jadehan

Python 매개변수 self 와 cls의 차이 그리고 static method에 대해서 본문

IT/python

Python 매개변수 self 와 cls의 차이 그리고 static method에 대해서

PaPhoPu 2016. 7. 2. 12:59

Python Instance method 와 Class method 의 차이점 그리고 Static method란?


가끔 기술된 파이썬 문서들을 보면 method 입력인자로 cls와 self 가 들어가는 것을 보신적이 있으실 겁니다. 

이 둘을 구분짓는 것은 "PEP8"에서 정의된 Instance method와 Class method의 차이에 따라 경우를 나누어씁니다.

Instance Method의 정의는 클래스 내부에 정의되어있는 함수를 호출할 때, Instance(객체)를 필요로 한다는 조건이 있는 것을 알 수 있습니다. 

이때 첫번째 매개변수는 항상 self이며 self이외에 다른 변수를 사용하는 것은 nameing convention에 어긋나는 일입니다.

## 인스턴스 메소드 예제
class InstMethod:

    def __init__(self):
        self.name = 'paphopu'

    def print_name(self):
        print('my name is %d' %(self.name))


# 인스턴스를 선언한다.
name_instance = InstMethod()

# print_name이라는 함수를 호출하기 위해선 name_instance처럼 객체를 먼저 정의해줘야합니다.
# 이것이 인스턴스 메소드입니다.
name_instance.print_name()
>>my name is papopu

이 처럼 특정 method를 호출하기 위해 Instance의 선언을 요구하는 method를 Instance method라고 부릅니다.






반면에, Class Method는 Instance Method와 다소 흡사하지만 첫번째 매개변수를 보내는 일을 하지 않고, 클래스
자기 자신을 첫번째 매개변수로 받는 차이가 있습니다. 또한 Class Method는 @classmethod 데코레이터를 이용하여 선언합니다.

이 경우 self를 사용하지 않고 cls를 매개변수로 사용하여 Class Method를 이용합니다.

##클래스 메소드 예제
class ClassMethod:

    @classmethod
    def print_name(cls):
        print('my name is %s' %(cls.__class__.__name__))


# 객체를 따로 선언해줄 필요없이 함수를 호출할 수 있습니다.
# 이것이 클래스 메소드입니다.
ClassMethod.print_name()
>>my name is type



마지막으로 Static Method는 앞의 두 method들과 다르게 인스턴스나 클래스를 인자로 받지 않습니다. 사실 Static Method는 클래스 내부에 선언되어 클래스 네임스페이드 안에 저장된다는 점을 제외하면 일반 method들과 크게 다른점이 없습니다.

static method의 특징은 클래스를 통해서도, 인스턴스를 통해서도 호출이 가능하다는 점입니다.


class StaticMethod:
    
    @staicmethod
    def print_name(name):
        return '내 이름은 {} 입니다.'.format(name)
    
# 클래스를 통해서 호출가능    
print(StaticMethod.print_name('minsoo'))
>>내 이름은 minsoo 입니다.

# 인스턴스를 통해서도 호출이 가능
me = StaticMethod()
print(me.print_name('minsoo'))
>>내 이름은 minsoo 입니다.

0 Comments
댓글쓰기 폼