클래스의 메서드에 대해서 조금 더 알아보겠습니다.
처음으로 클래스 메서드와 인스턴스 메서드입니다.
앞에서 했던 클래스 변수와 인스턴스 변수와 같은 맥락입니다.
클래스 메서드도 같은 클래스의 인스턴스들과 공유가 됩니다.
클래스 메서드의 기본형은 다음과 같습니다.
@classmethod
def 함수명(cls, ...):
수행할 코드
@classmethod는 데코레이터로 정의된 함수를 이용해서 다른 함수를 추가해주는 의미로 @함수명 입니다.
다음으로 인스턴스 메서드의 기본형은 다음과 같습니다.
def 함수명(self, ...):
수행할 코드
가장 큰 차이는 첫 번째 매개변수가 cls와 self란 점입니다.
어떤 차이냐면 cls는 자기 자신의 클래스를 뜻합니다. self는 객체를 뜻합니다.
클래스 메서드에는 인스턴스 변수를 사용할 수 없지만 인스턴스 메서드에서는 클래스 변수를 사용할 수 있습니다.
예제로 살펴보겠습니다.
class Person:
__count = 0 # 클래스 변수
def __init__(self, name, age, count=None):
self.name = name # 인스턴스 변수
self.age = age
Person.__count += 1
def show(self): # 인스턴스 메서드
print("이름 : ", self.name)
print("나이 : ", self.age)
print("등록된 사람 수 : ", Person.__count, "\n")
@classmethod
def countShow(cls): # 클래스 메서드
print("등록된 사람 수 : ", cls.__count, "\n")
a = Person("홍길동", 24)
a.show()
a.countShow()
Person.countShow()
클래스 메서드는 인스턴스, 클래스 모두 사용할 수 있습니다.
하지만 인스턴스 메서드는 해당 객체가 없기 때문에클래스에서 사용하면 예외가 발생합니다.
다음으로 정적 메서드(static method)입니다.
정적 메서드의 기본형은 다음과 같습니다.
@staticmethod
def 함수명(매개변수, ...):
수행할 코드
@staticmethod 데코레이터를 사용하여 정의합니다.
정적 메서드는 클래스 메서드와 굉장히 유사합니다.
인스턴스에서 호출할 수 있고 클래스에서도 호출할 수 있습니다.
대신 cls나 self를 받지 않습니다.
class Calculation:
sum = 0
@staticmethod
def add(num1, num2):
print(num1 + num2, "\n")
a = Calculation
a.add(15, 21)
Calculation.add(10, 19)
처음 클래스를 할 때 생성자와 소멸자를 하면서 잠깐 언급한 __add__에 대해서 조금 더 알아보겠습니다.
특수 메서드는 굉장히 종류가 많습니다.
그중에서 연산자 메서드에 대해서 알아보겠습니다.
연산자 메서드란 객체와 객체끼리 연산을 해주는 메서드입니다.
보통 클래스에서 재정의 해서 사용하는데 이걸 연산자 오버로딩이라고 합니다.
먼저 어떤 게 있는지 살펴보면
*노란색으로 표시된 메서드는 함수명 앞에 r를 붙이면 ex) __radd_ 좌변과 우변이 서로 바꿔서 연산됩니다.
연산자 메서드도 결국 메서드입니다.
일반 메서드를 사용하듯 사용할 수 있으나, 연산자 메서드는 더욱 쉽게 사용할 수 있습니다.
바로 연산자를 이용해서 사용할 수 있다는 장점입니다.
몇 가지만 예제로 살펴보겠습니다.
class Calculation:
sum = 0
def __init__(self, value):
self.value = value
def __pos__(self):
self.value += 10
print(self.value, "\n")
def __add__(self, other):
print(self.value + other.value, "\n")
def __sub__(self, value):
self.value -= value
print(self.value, "\n")
a = Calculation(100)
+a
b = Calculation(50)
a.__add__(b)
a + b
a - 100
인스턴스 변수에 100을 입력받은 Calculation의 인스턴스 a가 있습니다.+a는 바로 __pos__ 메서드를 실행시키기 위한 방법입니다.앞에서 연산자 메서드의 가장 큰 특징은 일반 메서드처럼 호출해서 사용해도 되지만 연산자 만으로도 사용이 가능하다 했습니다. __pos__는 매개변수로 self만 존재합니다. 그러므로 다른 객체 없이 자신에게만 연산자만으로 호출이 가능합니다.__add__는 self와 other로 매개변수가 2가지입니다. 여기서 other은 다른 객체를 의미합니다.그래서 Calculation의 인스턴스 b를 새롭게 생성해서 a + b를 하면 __add__가 호출되어 메서드의 명령이 실행됩니다.__sub__를 보면 상수를 매개변수로 이용할 수 있습니다.
어떤 식으로 재정의하느냐에 따라서 사용방법도 조금씩 다릅니다.
'공부 자료실 > 파이썬(Python)' 카테고리의 다른 글
파이썬(Python) - 예외 처리(Exception) _ raise, assert (0) | 2020.07.18 |
---|---|
파이썬(Python) - 예외 처리(Exception) (0) | 2020.07.17 |
파이썬(Python) - 클래스 _ 상속 (0) | 2020.07.15 |
파이썬(Python) - 클래스 _ 변수의 종류 및 접근권한 (0) | 2020.07.14 |
파이썬(Python) - 클래스(class) _ 클래스 생성 (0) | 2020.07.13 |
댓글