python의 정적메소드란?
정적메소드는 클래스에서 직접 접근할 수 있는 메소드이다.
class에서 직접 접근할 수 있는 메소드는 @staticmethod
와 @classmethod
가 있다.
python에서는 정적메소드임에도 인스턴스에서 접근 가능하다.
staticmethod
파이썬에서 사용법은 @staticmethod
라는 데코레이터를 사용하여 정의한다.
인스턴스 메소드처럼 self
라는 인자를 사용안해도 된다.
class A:
@staticmethod
def add(a, b):
return a+b
if __name__ == "__main__":
a = A()
a.add(1,2)
사용법은 이러하다.
classmethod
classmethod도 사용법은 @classmethod
라는 데코레이터를 사용하여 정의할 수 있다.
하지만, 여기선 cls
라는 인자를 붙여줘야한다.
class A:
@classmethod
def add(cls, a, b):
return a+b
if __name__ == "__main__":
a = A()
a.add(1,2)
클래스 메서드의 사용법이다.
두 개념의 차이점
아래의 코드를 보고 설명을 참고 하면 될것이다.
먼저 staticclass에 대한 코드이다.
hello라는 클래스의 num 속성에 접근 하려고 할때 객체로 접근하는 것이 아니기에 self.num을 사용할 순 없다.
만약 사용하고 싶다면 아래 staticmethod를 이용하여 사용할 수 있다.
class hello:
num = 10
@staticmethod
def calc(x):
return x+10+hello.num
if __name__ == "__main__":
print(hello.calc(10)) # 결과값 : 30
다음은 classmethod를 사용하여 접근 해볼 수 있다.
아래 코드중에 cls.num이 있는데, `cls`는 클래스를 가르키기 때문에 클래스의 어떤 속성에도 접근할 수 있다는 뜻이다.
그래서 cls.num을 통해 hello클래스의 num속성에 접근 할 수 있는것이다.
class hello:
num = 10
@classmethod
def calc(cls, x):
return x + 10 + cls.num
if __name__ == "__main__":
print(hello.calc(10)) # 결과값 : 30
위의 두 코드만 보고 바로 아! 이거다 라곤 이해 할 수 없을 것이다.
그렇다면 상속 관계로 되어있는 클래스를 상대로 classmethod를 알아보며 쉽게 이해하자.
class hello:
a = '부모클래스'
@classmethod
def calc(cls):
return cls.a
class hello_2(hello):
a = '자식클래스'
print(hello_2.calc()) # 결과값 : '부모클래스'
위 상속관계에 있는 클래스들을 보면 hello_2가 a속성을 업데이트한것을 볼 수 있다.
cls.a가 상속 시켜준 클래스에 있더라도 이것이 가리키는 것은 상속받은 클래스의 t속성이다.
cls는 상속 받은 클래스에서 먼저 찾는다.
classmethod는 클래스의 어떤 옵션을 바꾸는 목적으로 사용 가능하니 잘 알아두자
'python' 카테고리의 다른 글
python 객체지향(OOP) (0) | 2020.10.19 |
---|---|
python 객체지향(OOP) 설계 원칙 (0) | 2020.10.18 |
python @property에 대해서 (0) | 2020.10.13 |
python 개발환경 구축 pyenv-virtualenv install (0) | 2020.09.30 |
python 설치 및 환경 설정 (0) | 2020.09.30 |