@classmethod / @staticmethod

Nam Eun-Ji·2020년 11월 26일
0

정적메소드란?

클래스에서 직접 접근할 수 있는 메소드이다.
@staticmethod(정적 메소드)와 @classmethod(클래스 메소드)를 이용하면 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있다.

class Test:

    @staticmethod
    def func1():
        print('hello static')
    
    @classmethod
    def func2(cls):
        print('hello class')
Test.func1()   # hello static
Test.func2()   # hello class 

위에서 보는 것처럼 정적메소드는 self를 받지 않아 인스턴스 속성에는 접근할 수 없다. 그래서 보통 인스턴스의 속성, 메소드가 필요 없을 때나 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용한다.

class Test:
    def __init__(self):
        self.num = 5

    @staticmethod
    def func1():
        print('hello static')
        print(self.num)

    @classmethod
    def func2(cls):
        print('hello class')
        print(self.num)


Test.func1()   # NameError: name 'self' is not defined
Test.func2()   # NameError: name 'self' is not defined



@staticmethod / @classmethod

만약 self에 접근하고 싶다면?

@staticmethod에서 굳이 self에 접근하고자 한다면 아래와 같이 해주면 된다.
@classmethodcls를 이용하여 접근한다. cls는 클래스를 가르키고 이것으로 클래스의 어떤 속성에도 접근할 수 있다. classmethod는 클래스 자체를 객체처럼 보아 클래스 자체를 첫번째 인자로 넣어줘야 한다.

class Test:
    string = 'method'

    @staticmethod
    def func1():
        print('hello static ' + Test.string)

    @classmethod
    def func2(cls):
        print('hello class '+ cls.string)

Test.func1() # hello static method
Test.func2() # hello class method


상속에서 cls

cls는 상속받은 클래스에서 먼저 찾는다.
그래서 아래의 예를 보면 Child 클래스는 Parent를 상속받아 Parent의 item 내용을 반환한다.

class Parent:
    item = '부모클래스'

    @classmethod
    def func(cls):
        return cls.item

class Child(Parent):
    item = '자식클래스'

print(Child.func())  # '부모클래스'

혹시 몰라 이런 경우도 해보았다. 결과는 같았다.

class Parent:
    item = '부모클래스'
    
class Child(Parent):
    t = '자식클래스'

    @classmethod
    def func(cls):
        return cls.item

print(Child.func())  # '부모클래스'
profile
한 줄 소개가 자연스러워지는 그날까지

0개의 댓글