본문 바로가기

TIL

23.05.02 TIL

오늘은...

  1. AWS 강의를 3주차까지 수강하고 정리 하였다.
  2. 정적 메서드와 클래스 메서드에 대해 배웠다.

0. 인스턴스(instance) 메서드

클래스에 그냥 메서드를 선언하면 해당 메서드는 인스턴스 메서드로 취급이 된다. 객체에서 이 인스턴스 메서드를 호출하면 반드시 첫번째 매개 변수로 인스턴스가 넘어와야한다(이것이 바로 self가 필요한 이유이다). 만약 클래스로부터 호출할 경우 다른 객체를 첫번째 인자로 넣어줘야한다. 인스턴수 메서드는 이 self를 통해 인스턴스 속성(attribute)에 접근하거나 다른 인스턴스 메서드를 호출할 수 있다. 또한 self를 통해 클래스 속성에 접근하거나 클래스 메서드를 호출할 수 있다.

class AriticleCreateTest(APITestCase):
    def setUp(self) -> None:
        self.user_data={...}
        self.access = self.client.post(reverse("token_obtain_pair"), self.user_data).data["access"]

1. 클래스(class) 메서드

@classmethod 데코레이터를 사용해서 클래스에 메서드를 선언하면 해당 메서드는 클래스(class) 메서드가 되며, 첫번째 매개 변수로 클래스 자체가 넘어오게 된다(cls). cls를 통해 클래스 속성(attribute)에 접근하거나, 클래스 메서드를 호출할 수 있지만, 인스턴스 속성에 접근하거나 다른 인스턴스 메서드를 호출하는 것은 불가능하다.

class AriticleCreateTest(APITestCase):
    @classmethod
    def setUpTestData(cls):
        cls.user_data = {"email": "abcd@naver.com", "password": "1234!!1234!!"}
        cls.article_data = {"title": "sometitle", "content": "1234qwerasdf"}
        cls.user = User.objects.create_user("abcd@naver.com", "1234!!1234!!")

클래스 메소드를 통해 다음과 같이 객체가 생성된 횟수를 세는 등의 기능을 만들 수 있다.

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

또한 cls에 클래스가 넘어옴을 이용해 인스턴스를 만들어낼 수도 있다.

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    @classmethod
    def make_person_from_dict(cls,dictionary):
        return cls(dictionary['name'],dictionary['age'])

2. 정적(static) 메서드

@staticmethod 데코레이터를 사용해서 클래스에 메서드를 선언하면 해당 메서드는 정적(static) 메서드가 되며, 정적 메서드는 인스턴스 메서드나 클래스 메서드와 달리 첫번째 매개 변수가 할당되지 않는다. 따라서 정적 메서드 내에서는 인스턴스/클래스 속성에 접근하거나, 인스턴스/클래스 메서드를 호출하는 것이 불가능하다.

정적 메서드는 유틸리티 메서드를 구현할 때 많이 사용되며, side effect가 없는, 즉 함수 바깥의 상태에 변화를 일으키지 않는 '순수함수'를 만들기 위해 사용된다.

예를 들어 set.union() 정적 메서드는 두 set()객체를 입력으로 받아 두 객체의 값과 class 속성에는 어떠한 변화도 주지 않은채 두 set()객체의 합집합을 반환한다. 이런 순수함수는 굳이 클래스 내에 정의할 필요는 없지만, 코드의 가독성과 통일성을 위해 같은 클래스의 객체들을 위한 유사한 기능성 메서드들을 묶어 두고 싶다면 사용할 수 있다.

번외. 클래스(class) 메서드 vs. 정적(static) 메서드

클래스 메서드와 정적 메서드는 별도 인스턴스 생성없이 클래스를 대상으로 클래스 이름 뒤에 바로 . 오퍼레이터를 붙여서 호출할 수 있다는 점에서 동일하다.
차이점은 클래스 메서드, 클래스 속성에 접근하거나 다른 클래스 함수를 호출할 수 있고, 정적 메서드를 명시적으로 넘긴 다른 인자만 접근할 수 있다는 점이다.

 

레퍼런스


https://dojang.io/mod/page/view.php?id=2379

 

파이썬 코딩 도장: 35.2 정적 메서드 사용하기

지금까지 클래스의 메서드를 사용할 때 인스턴스를 통해서 호출했습니다. 이번에는 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있는 정적 메서드와 클래스 메서드에 대해 알아보겠습

dojang.io

https://www.daleseo.com/python-class-methods-vs-static-methods/

 

[파이썬] 정적(static) 메서드와 클래스(class) 메서드

Engineering Blog by Dale Seo

www.daleseo.com

 

'TIL' 카테고리의 다른 글

23.05.10 TIL  (0) 2023.05.11
23.05.09 TIL  (0) 2023.05.10
23.05.01 TIL  (0) 2023.05.01
23.04.28 TIL  (0) 2023.05.01
23.04.26 TIL - DRF 개인과제: model, view, serializer,url  (0) 2023.04.27