정적 메서드는 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있다.
매개변수로 self를 지정하지 않는다.
메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수함수
를 만들때 사용한다.
순수함수
는 부수효과가 없고 입력값이 같으면 언제나 같은 출력값을 반환한다.
즉, 정적 메서드는 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용한다.
class Calc:
@staticmethod
def add(a,b):
print(a + b)
@staticmethod
def mul(a,b):
print(a * b)
# 인스턴스 생성 없이 바로 메서드 호출
Calc.add(10,20)
Calc.mul(10,20)
인스턴스의 내용을 변경해야 할 때는 인스턴스 메소드
인스턴스 내용과 관계없이 결과만 구하면 될 때는 정적 메소드로 작성한다.
a = {1, 2, 3, 4}
a.update({5}) # 인스턴스 메소드
set.union({1, 2, 3, 4}, {5}) # 정적 메소드
인스턴스 없이 호출할 수 있는 것은 정적 메서드와 같지만,
클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 접근해야할 때 사용한다.
class Person:
count = 0 # 클래스 속성
def __init__(self):
Person.count += 1 # 인스턴스가 만들어질 때
# 클래스 속성 count에 1을 더함
@classmethod
def print_count(cls): # 매개변수로 cls(현재 클래스)가 들어옴
print('{0}명 생성되었습니다.'.format(cls.count)) # cls로 클래스 속성에 접근
james = Person()
maria = Person()
Person.print_count() # 2명 생성되었습니다.
cls 를 사용하면 메서드 안에서 현재 클래스의 인스턴스를 만들 수도 있다.
@classmethod
def create(cls):
p = cls()
return p
추상 클래스란 메서드의 목록만 가진 클래스이며, 상속받는 클래스에서 메서드 구현을 강제하기 위해 사용한다.
from abc import *
class StudentBase(metaclass=ABCMeta):
@abstractmethod
def study(self):
pass # 추상 클래스는 인스턴스를 만들 수 없으므로 빈 메서드로 만든다.
@abstractmethod
def go_to_school(self):
pass
class Student(StudentBase):
def study(self):
print('공부하기')
def go_to_school(self):
print('학교가기')
james = Student()
james.study()
james.go_to_school()