We.TIL 33 : Class&Static Method

김기욱·2020년 9월 13일
0

We.TIL

목록 보기
52/69

메서드

파이썬에서 메소드란 클래스 안에서 쓰이는 '함수'이다.
클래스 이름은 대문자로 시작하고 카멜케이스를 사용하지만, 메소드는 소문자로 기입하는게
일반적인 파이썬 코딩 스타일이다.

인스턴스 메서드

인스턴스 메서드는 가장 손쉽게 만들 수 있는 메서드 형태이다.

class Lion :
    def howling(self) :
        print("크르르르르")
        
    def count_lionbaby(a) :
    	return a*3

공백으로 만들어도 되는 함수와 달리 클래스안에 인스턴스 메서드를 쓸 때는
인자가 없어도 기본적으로 self라는 함수 자신을 뜻하는 매개변수(인자)를 넣어줘야 한다.

lion = Lion()

클래스는 클래스 자체로 쓸 수 없고, 변수를 써서 변환해 줘야한다. 이때 클래스를 받는 변수를
인스턴스라고 한다.

그러므로 인스턴스 메서드는 다음과 같은 형태로 쓸 수 있다.

lion = Lion()

lion.howling()
결과 : "크르르르르"

lion.count_lionbaby(2)
결과 : 6

스태틱 메서드

스태틱 메서드는 인스턴스 메서드가 필요없는 상황에서 쓰이는 메서드다.
인스턴스 없이 바로 클래스에서 호출이 가능하다.
self를 받지 않으므로 인스턴스 속성에는 접근할 수 없다.

class Lion :
    @staticmethod
    def howling():
    	print("크르르르르")

위와 같이 함수위에 빌트인 데코레이터인 @staticmethod를 붙여주면 해당 메서드는 스태틱메서드로 인식된다. 스태틱 메서드는 다음과 같은 형태로 쓸 수 있다.

Lion.howling()
결과 : "크르르르르"

스태틱메서드는 단순히 인스턴스 메서드가 필요없는 상황 외에도 메서드 실행이 외부상태에 영향을 끼치지 않는 순수함수(Pure Fuction)를 만들 때 사용한다.

def add(a, b):      # 함수 실행이 외부 상태에 영향을 끼치지 않음
    return a + b


number_list = [1, 2, 3]
 
def delete_number(n):        # 함수 실행이 외부 상태에 영향을 끼침
    number_list.remove(n)    # 함수 외부에 있는 number_list의 상태가 바뀜
 

위가 순수함수 아래가 비순수함수다.

클래스 메서드

클래스 메서드는 스태틱 메서드와 마찬가지로 인스턴스가 필요가 없는 메서드다.
차이점으로는 인스턴스메서드의 self와 같이 첫 번째 매개변수로는 cls가 들어와야 하며,
데코레이터 @classmethod를 붙여서 사용한다는 점이다.

class Person:
    count = 0    # 클래스 속성
 
    def __init__(self):
        Person.count += 1    # 인스턴스가 만들어질 때
                             # 클래스 속성 count에 1을 더함
 
    @classmethod
    def print_count(cls):
        print('{0}명 생성되었습니다.'.format(cls.count)) # cls로 클래스 속성에 접근
        
james = Person()
maria = Person()
 
Person.print_count()    
결과 : 2명 생성되었습니다.

클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 접근할 때 사용한다.
스태틱 메서드로도 클래스 속성에 접근은 가능하나 cls를 사용한 클래스 메서드가 좀 더 세련되게 접근 가능하다. 다음 예시를 보자.

class Person:
    num = 10

    @staticmethod
    def calc(x):
        return x + 10 + Person.num

print(Person.calc(10))
결과 : 30

class Person:
    num = 10

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

print(Person.calc(10))
결과 : 30

또한 스태틱메서드는 처음 정의된 클래스의 속성만 상속받지만, 클래스메서드는 현재클래스의 클래스 속성을 쓸 수 있다. 예를 보자.

class Person:
    gender = "여자"
    
     def __init__(self):
        self.data = self.default
    
    @classmethod
    def class_person(cls):
        return cls()
    
    @staticmethod
    def static_person():
        return Person()
    
class RealPerson(Person):   #Person클래스를 업데이트하는 클래스 RealPerson
    gender = "남자"
person1 = WhatPerson.class_person()   
결과 : "남자"
person2 = WhatPerson.static_person()   
결과 : "여자"

참조 : 위키독스, 파이썬 코딩도장

profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.

0개의 댓글