클래스에서 직접 접근할 수 있는 메소드이다.
@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
에서 굳이 self에 접근하고자 한다면 아래와 같이 해주면 된다.
@classmethod
는 cls
를 이용하여 접근한다. 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는 상속받은 클래스에서 먼저 찾는다.
그래서 아래의 예를 보면 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()) # '부모클래스'