35장 정적매서드, 클래스매서드 설명에
@staticmethod
@classmethod 쓰는게 있는데
@부분을 뺴고 정적매서드를 작성해도 똑같이 실행이 되고
클래스매서드의 첫 인자를 cls가 아닌 self나 그냥 아무 인자를 넣어도 똑같이 실행이 됩니다.
사실상 형식대로 안써도 상관이 없는 부분인가요??
실행한 코드가 어떻게 되는지 모르겠지만, 단순히
@staticmethod
def add(a,b):
print(a+b)
라고 하면 당연히 @staticmethod 없이도 실행됩니다. 속성에 접근을 안하기 때문입니다.
class tmp:elem_1 = 10
__elem_2 = 20
def __init__(self):
self.elem_3 = 30
self.__elem_4 = 40
def function():
print(self.elem_1)
print(self.__elem_2)
print(self.elem_3)
print(self.__elem_4)
x = tmp()
x.function()
임시로 만든 클래스 tmp입니다.
인스턴스 속성과 비공개 인스턴트속성, 클래스 속성과 비공개 클래스 속성을 모두 작성한 클래스입니다. 그리고 function 함수로 각각의 값들을 출력하는데 def function()을 정적매서드, 클래스매서드로 만들어 동작해보시기 바랍니다.
정적 매서드는 인자로 self를 받지 않습니다. 그래서 function매서드의 self.~~는 동작하지 않습니다. 굳이 self를 넣고 함수 호출시 인자로 자기자신(x.function(x))을 할 순 있으나 효율적이지 않습니다.
클래스매서드로 바꿔 실행해보면 elem_1, __elem_2는 출력을 하지만 3과 4는 예외가 출력됩니다. 3,4는 인스턴스 속성이므로 클래스 속성에 접근이 불가합니다.
틀린 내용 있으면 지적 바랍니다.
클래스에는 인스턴스 메서드, 정적 메서드, 클래스 메서드가 있습니다.
각각의 용도에는 차이가 있습니다.
- 인스턴스 메서드: 객체 자체에 있는 정보(데이터)를 사용
- 정적 메서드: 객체 자체의 정보를 사용하지 않는 순수 함수
- 클래스 메서드: 클래스의 정보를 사용하는 함수
객체(인스턴스)를 여러 개 만들었을 때 인스턴스 메서드는 각각의 결과를 냅니다.
정적 메서드는 객체 전체에서 공유하므로 어떤 인스턴스에서 호출해도 같은 결과를 냅니다.
클래스 메서드는 해당 클래스의 정보를 이용해 결과를 냅니다.
이때 정적 메서드와 클래스 메서드는 같아 보이는데,
A -> B 클래스로 상속했을 때 차이가 드러납니다.
정적 메서드는 상속해서 A와 B가 같은 정보를 공유하므로 같고,
클래스 메서드는 클래스의 정보만 이용하므로 A에서 호출하면 A 클래스의 정보를 이용하고, B에서 호출하면 B 클래스의 정보를 이용합니다. 클래스 자체의 정보를 이용할 때 사용합니다.
다른 언어는 정적 메서드를 클래스.정적메서드로 접근하는데, 파이썬은 클래스.정적메서드, 인스턴스.정적메서드, 두 가지 모두 가능합니다. 그래서 주의해야 합니다. 다른 언어와 마찬가지로 정적 메서드는 클래스.정적메서드로 쓰는 것이 좋습니다.
다음 예제를 살펴보세요.
https://glot.io/snippets/fbutmlo0h9