오늘은...
- AWS 강의를 3주차까지 수강하고 정리 하였다.
- 정적 메서드와 클래스 메서드에 대해 배웠다.
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 |