클래스 내에 작성된 함수를 메서드(method)라고 부른다.
함수만 작성된 것은 그냥 함수라고 부른다.
보통 함수와 메서드를 구분하는 방법이다.
파이썬에서 메서드는 크게 3가지로 나뉜다.
- 인스턴스 메서드(instance method)
- 정적 메서드(static method)
- 클래스 메서드(class method)
1. 인스턴스 메서드(instance method)
함수 첫 번째 인자에 클래스 객체 자기 자신을 의미하는 self 가 들어간다.
예시코드
class Test:
a = 1
def __init__(self):
self.b = 2
def abc(self):
print("abc")
print(self.a)
def abcd(self):
print('abcd')
print(self.b)
self.abc()
if __name__ == "__main__":
test = Test()
test.abc()
test.abcd()
# 출력
# abc
# 1
# abcd
# 2
# abc
# 1
a는 클래스 전역에 선언된 전역 변수이다. 속성(attribute)라고도 한다. 속성에 관한 정확한 정보는 아래 참고[2]에서 확인할 수 있다.
__init__은 생성자이다.
abc 메서드는 전역 변수로 선언된 a를 self를 붙여 가져와 사용한다.
abcd 메서드는 인스턴스 메서드인 abc를 self를 붙여 호출한다.
2. 정적 메서드(static method)
클래스의 객체와 독립적으로 기능한다.
self가 없으므로 인스턴스 변수에 접근이 불가능하다. 클래스 안에 있지만 인스턴스 메서드와 같이 사용하지 못하고, 독립적인 하나의 함수라고 봐도 무방하다.
계산한 값을 인스턴스에 저장하고 싶지 않을 때 사용한다.
예시코드
class Test:
a = 1
def __init__(self):
self.b = 2
@staticmethod
def abc():
print("abc")
print(Test.a)
if __name__ == "__main__":
Test.abc()
# 출력
# abcd
# 1
인스턴스 메서드를 위와같이 호출하면 에러가 발생한다. 인스턴스 객체가 생성되지 않았기 때문이다.
정적 메서드는 인스턴스 객체를 생성하지 않고도 호출이 가능한 메서드이다.
ex)
a = {1, 2, 3, 4}
a.update({5}) # 인스턴스 메서드
print(a) # 결과값 {1, 2, 3, 4, 5}
print(set.union({1, 2, 3, 4}, {5})) #1 정적 메서드, 결과값 {1, 2, 3, 4, 5}
3. 클래스 메서드(class method)
self 대신 cls(class) 라는 매개변수를 갖는다.
정적 메서드 처럼 인스턴스 없이 호출할 수 있다. 하지만 클래스 내부의 변수(속성) 또는 클래스 메서드에 접근해야 할 때 사용한다.
팩토리 메서드를 작성할 때 사용한다. 다양한 포멧의 데이터로부터 객체를 생성할 때 유용하게 쓸 수 있다.
예시코드
class Person:
count = 0 # 클래스 속성
def __init__(self):
Person.count += 1 # 인스턴스가 만들어질 때
# 클래스 속성 count에 1을 더함
@classmethod
def print_count(cls):
print('{0}명 생성되었습니다.'.format(cls.count)) # cls로 클래스 속성에 접근
james = Person()
maria = Person()
Person.print_count() # 2명 생성되었습니다.
참고
[2] https://076923.github.io/posts/Python-37/
https://dojang.io/mod/page/view.php?id=2380
https://journeytosth.tistory.com/73
'파이썬(Python)' 카테고리의 다른 글
[python] poetry로 패키지 관리하기 (0) | 2022.09.25 |
---|