[210725 TIL] Python

Choi Rim·2021년 7월 25일
0

Python

목록 보기
16/20
post-thumbnail

정적 메서드

class 클래스이름:
	@staticmethod
    def 메서드(매개변수1, 매개변수2):
    	코드
  • 정적 메서드는 메서드 위에 @staticmethod를 붙음
  • 매개변수에 self를 지정하지 않음
  • @staticmethod와 같이 앞에 @가 붙은 것을 데코레이터라고 하며 메서드(함수)에 추가 기능을 구현할 때 사용
class Calc:
  @staticmethod
  def add(a, b):
    print(a + b)

  @staticmethod
  def mul(a, b):
    print(a * b)

Calc.add(10, 20) #클래스에서 바로 메서드 호출
Calc.mul(20, 30) #클래스에서 바로 메서드 호출

30
600

  • 클래스.메서드()
  • 정적 메서드는 self를 받지 않으므로 인스턴스 속성에 접근할 수 없음
  • 정적 메서드는 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용
  • 정적 메서드는 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수 함수(pure function)을 만들 때 사용
  • 순수 함수는 부수 효과(side effect)가 없고 입력 값이 같으면 언제나 같은 출력 값을 반환
  • 정적 메서드는 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용

클래스 메서드

class 클래스이름:
	@classmethod
    def 메서드(cls, 매개변수1, 매개변수2):
    	코드
  • 클래스 메서드는 다음과 같이 메서드 위에 @classmethod를 붙임
  • 클래스 메서드는 첫 번째 매개변수에 cls를 지정해야 함(cls는 class에서 따옴)
class Person:
  count = 0 # 클래스 속성

  def __init__(self):
    Person.count += 1
  
  @classmethod
  def print_count(cls):
    print('{0}명 생성되었습니다'.format(cls.count))

hyerim   = Person()
hyeyoung = Person()
nahyun   = Person()

Person.print_count()

3명 생성되었습니다.

날짜 클래스 만들기

class Date:
  @staticmethod
  def is_date_valid(date_string):
    year, month, day = map(int, date_string.split('-'))
    return month <= 12 and day <= 31

if Date.is_date_valid('2000-12-31'):
  print('올바른 날짜 형식입니다.')
else:
  print('잘못된 날짜 형식입니다.')

올바른 날짜 형식입니다.

  • is_date_valid 메서드는 Date.is_date_valid 처럼 호출하고 있지만, 문자열이 올바른 날짜인지 검사만 하면 되고, 클래스에 접근할 필요는 없다.
    • 그러므로 정적 메서드로 만든다.
  • 먼저 메서드 위에 @staticmethod를 붙여준 뒤 첫 번째 매개변수로 날짜 문자열 date_string을 지정한다.
  • 메서드 안에서는 year, month, day = map(int, date_string.split('-') 와 같이 '-'로 문자열을 분리한 뒤 int로 변환해서 각 변수에 넣어준다.
  • 그 다음 return month <= 12 and day <= 와 같이 월이 12 이하면서 일이 31일 이하인지 검사하고 결과를 반환하도록 한다.
  • 즉, 월과 일 모두 만족하면 True가 반환되고 하나라도 만족하지 않으면 False가 반환된다.

시간 클래스 만들기

class Time:
  def __init__(self, hour, minute, second):
    self.hour = hour
    self.minute = minute
    self.second = second
 
  @staticmethod
  def is_time_valid(time_string):
    hour, minute, second = map(int, time_string.split(':'))
    return hour <= 24 and minute <= 59 and second <= 60
    
  @classmethod
  def from_string(cls, time_string):
    hour, minute, second = map(int, time_string.split(':'))
    time = cls(hour, minute, second)
    return time
 
time_string = input()
 
if Time.is_time_valid(time_string):
    t = Time.from_string(time_string)
    print(t.hour, t.minute, t.second)
else:
    print('잘못된 시간 형식입니다.')
  • Time 클래스에서는 인스턴스 속성이 hour, minute, second가 있다.
    • Time에 숫자를 넣어서 인스턴스를 만들면 되지만 여기서는 from_string 메서드를 사용하여 문자열로 인스턴스를 만들어야 한다.
  • from_string 메서드는 Time.from_string 형식으로 호출하고 있고, 현재 클래스로 인스턴스를 만들어야 하므로 클래스 메서드로 만든다.
    • 인스턴스는 바깥에서 사용할 수 있도록 return 으로 반환해 준다.
  • is_time_valid 메서드도 Date.is_time_valid 형식으로 호출하고 있지만, 문자열이 올바른 시간인지 검사만 하면 되고, 클래스에 접근할 필요가 없으므로 정적 메서드로 만든다.

<참고>

profile
https://rimi0108.github.io/

0개의 댓글