instance method
class UserInfo:
# instance method
def leave(self):
self.user.delete()
self.user = None
self.real_name = None
self.save()
instance method는 위와 같이 인스턴스를 활용하는 로직(조회, 수정, 삭제)이 필요할 때, 쓰이는 함수다.
함수를 호출한 인스턴스를 암시하는 self
를 첫 번째 인자로 받습니다.
classmethod
메서드를 클래스 메서드로 변환합니다. 인스턴스 메서드가 인스턴스를 받는 것처럼, 클래스 메서드는 클래스를 묵시적인 첫 번째 인자로 받습니다. 클래스 메서드를 선언하려면 이 관용구를 사용합니다.
class C:
@classmethod
def f(cls, arg1, arg2, ...): ...
@classmethod
형식은 함수 데코레이터 입니다. 클래스 (C.f() 처럼) 또는 인스턴스 (C().f() 처럼) 를 통해 호출할 수 있습니다. 인스턴스는 클래스만 참조하고 무시됩니다. 파생 클래스에 대해 클래스 메서드가 호출되면, 파생 클래스 객체가 묵시적인 첫 번째 인자로 전달됩니다.(If a class method is called for a derived class, the derived class object is passed as the implied first argument.)
classmethod
와 staticmethod
의 차이가 이해되지 않아, 다른 블로그에서 본 예제는 아래와 같다.
class Language:
default_language = "English"
def __init__(self):
self.show = '나의 언어는 ' + self.default_language
@classmethod
def class_my_language(cls):
return cls()
@staticmethod
def static_my_language():
return Language()
def print_language(self):
print(self.show)
class KoreanLanguage(Language):
default_language = "한국어"
비교 결과는 아래와 같다. classmethod
에서는 cls인자를 활용하여 cls의 클래스 속성을 가져올 수 있다.
즉, 파생 클래스에서 classmethod
를 호출하면, 파생 클래스 객체가 암시된 첫 번째 인자로 전달되기에 cls 인자를 활용할 수 있다.
>>> staticmethod = KoreanLanguage.static_my_language()
>>> classmethod = KoreanLanguage.class_my_language()
>>> staticmethod.print_language()
나의 언어는 English
>>> classmethod.print_language()
나의 언어는 한국어
클래스 메서드는 C++ 또는 자바의 정적 메서드와 다릅니다. 그것들을 원하면, 이 섹션의 staticmethod()
를 보세요. 클래스 메서드에 대한 더 자세한 정보를 원하면, 표준형 계층 에 있는 표준 형 계층에 대한 도큐멘테이션을 참고하세요.
- https://docs.python.org/ko/3.6/library/functions.html?highlight=classmethod#classmethod
- https://suwoni-codelab.com/python%20%EA%B8%B0%EB%B3%B8/2018/03/11/Python-Basic-class-staticmethod/
staticmethod
메서드를 정적 메서드로 변환합니다. 정적 메서드는 묵시적인 첫 번째 인자를 받지 않습니다. 정적 메서드를 선언하려면, 이 관용구를 사용하세요.
class C:
@staticmethod
def f(arg1, arg2, ...): ...
@staticmethod
형식은 함수 데코레이터 입니다. 클래스 (C.f() 처럼) 또는 인스턴스 (C().f() 처럼)에 대해 호출할 수 있습니다. 인스턴스는 해당 클래스만 참조하고 무시합니다. 파이썬의 정적 메서드는 자바 또는 C++ 에서 발견되는 정적 메서드와 비슷합니다. 대체 클래스 생성자를 만드는 데 유용한 변형을 보려면 classmethod()
도 보세요. 모든 데코레이터와 마찬가지로, staticmethod
를 정규 함수로 호출하여 그 결과로 어떤 일을 할 수도 있습니다.
이것은 클래스 바디에서 함수에 대한 참조가 필요하고, 인스턴스 메서드로 자동 변환되는 것을 피하고자 할 때 필요합니다. 이 경우 다음 관용구를 사용하세요. (This is needed in some cases where you need a reference to a function from a class body and you want to avoid the automatic transformation to instance method.)
class C:
builtin_open = staticmethod(open)