python

Class method vs Static method in python

코드모헨 2024. 1. 3. 15:14

메소드(method)에는 여러 종류가 있다.

그 중 오늘은 class method와 static method에 대해 알아보자!

 

class method, static method 비슷하면서 목적이 다르다.

 

class method

  • 첫 인자로 cls를 갖는다 cls는 class를 뜻하며 일반적인 class 내부 method의 self의 역할에 해당한다.
  • cls 인자의 의미는 "instance를 통해 method가 작용하지 않는다" 를 의미한다.
  • class 변수에 접근할때 사용된다
  • factory method를 만들 때 주로 사용된다.

 

static method

  • 첫 인자로 cls, self 같은 인자를 받지 않는다. 일반 함수처럼  바로 인자를 받는다.
  • instance를 통해 method가 작동하지 않는다 class에서 바로 작동한다.
  • class와 관련된 요소에 적용한다 class나 instance의 작업에 개입하지 않는다.

 

class method vs statice method

두 개의 메소드 전부 instance를 통해서 작동되지 않는다.

 

여기서 instance를 통해서 작동하지 않는다는 것은 다음과 같다.

from dataclasses import dataclass

@dataclass
class Book:
    title: str
    author: str

    @classmethod
    def from_dict(cls, data):
        return cls(data['title'], data['author'])

    @staticmethod
    def is_isbn_valid(isbn):
        return len(isbn) == 13 and isbn.isdigit()

# book1 instance 생성
book1 = Book("1984", "George Orwell")
# 새로운 책 정보
book_info = {'title': "To Kill a Mockingbird", 'author': "Harper Lee"}
# book2 instance 생성 하지만 class method를 이용해서 정의
# instance에서 from_dict함수를 call하지 않았다!
book2 = Book.from_dict(book_info)

 

위 코드를 보면 book2를 만들때 Book.from_dict이라고 선언한게 보이는가?

class에서 바로 함수를 call 했다.

 

위에 코드에서 from_dict은 class의 title과 author의 값 즉 class의 속성(attribute)값을 바꾸는데 사용되었다.

 

그럼 static method는 어떨까?

# isbn이 유효한가?
isbn = "9781234567897"
print(f"Is {isbn} a valid ISBN? {Book.is_isbn_valid(isbn)}")

 

static method is_isbn_valid를 통해 우린 외부 변수(value) 의 값이 유효한지 아닌지 책 이란 클래스를 통해서 확인하고 있다.

단순히 is_isbn_valid라는 함수가 아닌 책에 종속된 static method를 통해 우린 좀 더 관리하기 쉬운 방법을 적용한 것이다.

Book class에 이러한 검증 함수를 넣어 우린 책에 대한 정보를 확인할 수 있게 되었다.
동시에 is_isbn_valid와 같은 함수는 class 속성에 어떠한 영향도 주지 않는다.
이러한 함수를 우린 static method로 정의한다.

 

결론 

class method는 class의 속성값에 영향을 주는 method일때 사용한다!

 

static method는 class의 속성값에 영향을 주지 않지만 class와 관련된 요소에 접근할때 사용한다!

 

 

'python' 카테고리의 다른 글

[FastAPI] restapi를 위한 코드 순서  (0) 2024.09.26
poetry add 혹은 pipenv install 무한로딩  (0) 2024.05.08
class 적응하기 2  (0) 2024.01.30
class 적응하기 1  (0) 2024.01.30
동기(sync)&비동기(async)  (2) 2023.12.22