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를 이용해 특정 날짜가 휴일인지 확인할 수 있습니다.
'파이썬' 카테고리의 다른 글
파이썬 인스턴스 메소드 이해하기 (0) | 2023.01.27 |
---|---|
파이썬 스태틱메소드 이해하기 (0) | 2023.01.26 |
파이썬 캡슐화, 은닉화 이해하기 (0) | 2023.01.26 |
파이썬 상속, 다형성 이해하기 (0) | 2023.01.26 |
파이썬 클래스 정의하기 (0) | 2023.01.26 |
댓글