홍카나의 공부방

[Python] ClassMethod와 StaticMethod 본문

Programming Language/Python

[Python] ClassMethod와 StaticMethod

홍문관카페나무 2023. 5. 27. 14:42

ClassMethod

  • StaticMethod처럼 클래스의 인스턴스 없이 호출할 수 있다는 점은 동일하다.
  • ClassMethod는 메소드 안에서 클래스 속성이나 메소드에 접근해야 할 때 사용한다.
  • 클래스 메소드는 다음 코드처럼 메소드 위에 @classmethod를 붙인다. 그리고 첫 번째 매개변수에 cls를 지정해야 한다. ( 두번째 메소드 부터는 상관없다. )
  • 앞에 @이 붙은 것을 데코레이터라고 하며, 메소드에 추가 기능을 구현할 때 사용한다.
  • 위 매개변수에서 cls가 해당 class를 의미하는 것이다.
class User:
    total = 0 # __init__에 만들어주지 않았으므로, 클래스 속성
    
    def __init__(self):
    	User.total += 1 # 인스턴스가 만들어질 때 class 속성 total++
        
    @classmethod
    def print_total(cls):
    	print(f"{cls.total}명 생성되었음.") # cls로 클래스 속성 접근

user1 = User()
user2 = User()

User.print_total() # "2명 생성되었음."

 

StaticMethod

  • ClassMethod처럼 역시나 인스턴스를 만들지 않아도 클래스를 통해 호출할 수 있다.
  • 정적 메소드는 메소드 위에 @staticmethod를 붙여서 만든다. 정적 메소드의 매개변수에는 보통 self를 지정하지 않는다.
  • 클래스에 대한 참조 없이 독립적인 메소드를 만들어야할 때, 정적 메소드를 사용하면 된다.
class MyClass:
    count = 1
    def __init__(self):
        self.number = 1

    @staticmethod
    def my_method(a, b):
        print(a+b)
    
    @staticmethod
    def my_method2(self): # 오류는 안나나, 옳지 않음!
        print(self.number)

MyClass.my_method(10,20) # "30"
mc = MyClass() # 인스턴스 생성
print(mc.number) # 인스턴스 속성 프린트
mc.my_method2() # 오류!

 

 

반응형