본문 바로가기
파이썬

파이썬 클래스메소드

by python pro 2023. 1. 26.
반응형

Python에서 클래스메소드는 클래스 내부에서 정의되며, 클래스 자체에 속해 있는 메소드를 의미합니다. 클래스메소드는 인스턴스 메소드와는 달리 인스턴스 생성 없이도 호출이 가능합니다.

 

아래는 클래스메소드를 정의하는 예시입니다.

class MyClass:
    @classmethod
    def class_method(cls):
        return "This is a class method"

print(MyClass.class_method())  # "This is a class method"

 

위 코드에서 @classmethod 데코레이터는 클래스메소드를 정의할 때 사용됩니다. class_method 메소드는 클래스 이름을 인자로 받는 cls를 첫번째 인자로 갖습니다.

 

클래스메소드는 인스턴스 생성 없이도 호출이 가능하지만, 인스턴스를 통해서도 호출이 가능합니다.

obj = MyClass()
print(obj.class_method())  # "This is a class method"

 

잘못된 코드 예시는 아래와 같습니다.

class MyClass:
    def class_method(self):
        return "This is a class method"

print(MyClass.class_method())  # TypeError: class_method() takes 1 positional argument but 2 were given

 

클래스메소드는 주로 클래스 자체에 관련된 작업을 수행하는데 사용됩니다. 예를 들어, 클래스 속성을 수정하는 메소드나, 클래스 내부에 정의된 인스턴스들을 관리하는 메소드 등이 있습니다.

class MyClass:
    class_var = "class variable"

    @classmethod
    def change_class_var(cls, new_val):
        cls.class_var = new_val
    
    @classmethod
    def print_class_var(cls):
        print(cls.class_var)

print(MyClass.class_var)  # "class variable"
MyClass.change_class_var("new value")
MyClass.print_class_var()  # "new value"

위 코드는 MyClass 클래스에 class_var라는 클래스 속성을 정의하고, 클래스메소드 change_class_var를 통해 이를 변경하는 예시입니다.

 

클래스메소드는 상속관계에서도 사용될 수 있습니다. 아래 코드는 MyClass를 상속하는 MySubClass를 정의하고, 클래스메소드를 상속받는 예시입니다.

class MySubClass(MyClass):
    pass

MySubClass.print_class_var()  # "new value"

앞서 설명한 것처럼 클래스메소드는 클래스 자체에 관련된 작업을 수행하는데 유용하며, 클래스 자체에 속해 있는 메소드라는 점에서 인스턴스 생성 없이도 호출이 가능합니다. 클래스메소드를 정의할 때는 @classmethod 데코레이터를 사용하고, 첫번째 인자로 클래스 이름을 받는 cls를 사용합니다.

 

클래스메소드는 상속관계에서도 사용될 수 있으며, 이러한 점을 이용해 클래스를 관리하는 작업을 수행할 수 있습니다.

 

정리하면, 클래스메소드는 클래스 자체에 관련된 작업을 수행하며, 클래스 자체에 속해 있는 메소드라는 점에서 인스턴스 생성 없이도 호출이 가능합니다.

 

마지막으로, 클래스메소드에서도 인스턴스 속성과 클래스 속성 모두 사용이 가능하지만, 클래스메소드는 클래스 자체에 관련된 작업을 수행하므로 클래스 속성을 사용하는 것이 좋습니다.

 

아래는 클래스메소드에서 인스턴스 속성과 클래스 속성을 사용하는 예시입니다.

class MyClass:
    class_var = "class variable"

    def __init__(self):
        self.instance_var = "instance variable"

    @classmethod
    def print_class_var(cls):
        print(cls.class_var)

    @classmethod
    def print_instance_var(cls):
        print(cls().instance_var)

MyClass.print_class_var()  # "class variable"
MyClass.print_instance_var()  # "instance variable"

 

Python에서 클래스메소드를 실제 업무에서 사용할 수 있는 예제 코드입니다.

class Employee:
    raise_amount = 1.04  # 기본 인상률
    employee_count = 0  # 직원 수

    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay
        self.email = first + '.' + last + '@company.com'

        Employee.employee_count += 1  # 인스턴스 생성 시 직원 수 증가

    def fullname(self):
        return f'{self.first} {self.last}'

    def apply_raise(self):
        self.pay = int(self.pay * self.raise_amount)

    @classmethod
    def set_raise_amount(cls, amount):
        cls.raise_amount = amount

    @classmethod
    def from_string(cls, emp_str):
        first, last, pay = emp_str.split('-')
        return cls(first, last, pay)

    @staticmethod
    def is_workday(day):
        if day.weekday() == 5 or day.weekday() == 6:
            return False
        return True

emp_1 = Employee('Corey', 'Schafer', 50000)
emp_2 = Employee('Test', 'User', 60000)

# 클래스메소드를 통해 인상률 설정
Employee.set_raise_amount(1.05)

# 인스턴스를 통해 인상률 설정
emp_1.set_raise_amount(1.06)

print(emp_1.raise_amount)  # 1.06
print(emp_2.raise_amount)  # 1.05

# 클래스메소드를 통해 인스턴스 생성
emp_str_1 = 'John-Doe-70000'
emp_str_2 = 'Steve-Smith-30000'
new_emp_1 = Employee.from_string(emp_str_1)

print(new_emp_1.email)  # John.Doe@company.com
print(new_emp_1.pay)  # 70000

# 정적메소드를 통해 특정 날짜가 휴일인지 확인
import datetime

my_date = datetime.date(2022, 1, 15)
print(Employee.is_workday(my_date)) # False

my_date = datetime.date(2022, 1, 18)
print(Employee.is_workday(my_date)) # True

이 예제 코드는 회사의 직원(Employee)를 나타내는 클래스를 정의하고, 클래스메소드, 정적메소드를 이용해 업무에서 사용되는 기능을 구현하는 예제입니다.

 

클래스메소드 set_raise_amount를 이용해 인상률을 설정하고, from_string를 이용해 인스턴스를 생성할 수 있습니다. 정적메소드 is_workday를 이용해 특정 날짜가 휴일인지 확인할 수 있습니다.

반응형

댓글