본문 바로가기

python

python 정적메소드

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