포스트

[Python] @staticmethod, @classmethod

파이썬 코드를 보다 보면 클래스 내에서 자주 등장하는 데코레이터인 @classmethod@staticmethod에 대해 자세히 알아보았다.

1. @staticmethod

1.1 특징

  1. 인스턴스에 접근하지 않는다.
    • @staticmethod로 정의된 메서드는 함수의 인자로 클래스 인스턴스(’self’)나 클래스 그 자체(’cls’)를 첫번째로 받지 않는다.
    • 그렇기 때문에 인스턴스 변수나 클래스 그 자체에 접근이 불가능하다.
  2. 클래스 혹은 인스턴스를 필요로 하지 않는다.
    • 클래스 인스턴스가 없어도 호출 가능하다.
    • 클래스 이름을 통해 직접적으로 호출 가능하다.

1.2 용도

  1. 유틸리티 함수

    클래스 내부에서 정의되지만, 특정 인스턴스에 속하지 않고, 클래스 자체에 관련된 작업을 수행하는 경우 사용.

  2. 코드 조직화

    관련 있는 함수들(ex. 비밀번호에 대한 작업을 수행하는 함수들)을 엮어서 코드 가독성을 높일 수 있음.

1.3 예제

아래는 직접 만들어본 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MathOperations:
    @staticmethod
    def add(x, y):
        return x + y
    
    @staticmethod
    def multiply(x, y):
        return x * y

result1 = MathOperations.add(5, 3)
result2 = MathOperations.multiply(5, 3)

print(result1)  # 출력: 8
print(result2)  # 출력: 15

MathOperation 클래스 내의 정적 메서드 addmultiply는 인스턴스 선언 없이 바로 사용 가능하다.

2. @classmethod

2.1 특징

  1. 클래스를 첫 번째 인자로 받는다.
    • @classmethod 로 정의된 메서드는 첫 번째 인자로 자기 자신의 클래스인 cls 를 받는다.
    • 이를 통해 다른 변수나, 클래스 메서드에 접근 가능.
  2. 인스턴스 없이 호출 가능.
    • 정적 메서드와 같은 특징을 공유한다.

2.2 용도

  1. 클래스 레벨 작업
    • 클래스를 인자로 받기 때문에 클래스 변수를 읽거나 관련된 작업을 수행하기 용이하다.
  2. 팩토리 메서드
    • 클래스 인스턴스를 생성, 반환하는 팩터리 메서드를 정의할 때 사용 가능하다. 여러 생성자를 구현할때 도움이 된다.

2.3 예제

@classmethod 를 사용해 간단한 팩토리 메서드 예제를 구현해보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    @classmethod
    def from_birth_year(cls, name, birth_year):
        age = 2024 - birth_year
        return cls(name, age)

# 클래스를 사용하여 인스턴스를 생성
person1 = Person("Alice", 30)
person2 = Person.from_birth_year("Bob", 1994)

print(person1.name, person1.age)  # 출력: Alice 30
print(person2.name, person2.age)  # 출력: Bob 30

예제에서 person1 의 경우 직접 클래스를 호출하여 객체를 생성했지만 person2 의 경우 클래스 내 클래스메서드인 from_birth_year 를 사용해 객체를 생성했다.

객체를 생성하면서 birthyear 를 함께 받아 클래스 변수인 self.age를 할당해 줄 수 있다.

3. 공통점 vs 차이점

  • 공통점
    1. 두 데코레이터 모두 클래스 레벨에서 정의된다.
    2. 인스턴스 선언 없이 클래스 이름에서 바로 사용 가능하다.
  • 차이점
    1. @staticmethod의 경우 클래스나, 클래스 변수에 간섭하지 않는다.
    2. @staticmethodcls(클래스) 나 self를 인자로 받지 않는다.
    3. @classmethod 는 클래스 자체에 영향을 주거나, 클래스 변수에 영향을 준다.
    4. @classmethodcls를 첫 번째 인자로 받아야 한다.


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.