파이썬에서 메소드란 클래스 안에서 쓰이는 '함수'이다.
클래스 이름은 대문자로 시작하고 카멜케이스를 사용하지만, 메소드는 소문자로 기입하는게
일반적인 파이썬 코딩 스타일이다.
인스턴스 메서드는 가장 손쉽게 만들 수 있는 메서드 형태이다.
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()
결과 : "여자"
참조 : 위키독스, 파이썬 코딩도장