본문 바로가기
Python Object-oriented Programming

Abstract Class

by 자동매매 2023. 3. 31.

Introduction to Python Abstract Classes

 

  • 객체 지향 프로그래밍에서 추상 클래스는 인스턴스화할 수 없는 클래스 입니다. 그러나 추상 클래스를 상속하는 클래스를 만들 수 있습니다. 
  • 일반적으로 추상 클래스를 사용하여 다른 클래스에 대한 청사진을 만듭니다. 
  • 마찬가지로 추상 메서드는 구현이 없는 메서드입니다.
  • 추상 클래스는 추상 메서드를 포함하거나 포함하지 않을 수 있습니다.

 Python 추상 클래스를 직접 지원하지 않습니다. 그러나 추상 클래스를 정의할 있는 모듈을 제공합니다 . 

추상 클래스를 정의하려면 abc(추상 기본 클래스) 모듈을 사용합니다.

abc모듈은 추상 기본 클래스를 정의하기 위한 인프라를 제공합니다.

 

from abc import ABC

class AbstractClassName(ABC):
    pass

 

추상 메서드를 정의하려면 @abstractmethod데코레이터를 사용합니다.

 

from abc import ABC, abstractmethod

class AbstractClassName(ABC):
    @abstractmethod
    def abstract_method_name(self):
        pass

 

Python abstract class example

회사의 급여 프로그램을 개발해야 한다고 가정합니다. 

회사에는 정규 직원과 시간제 직원의 그룹의 직원이 있습니다. 타임 직원은 고정 급여를 받고 시간당 직원은 서비스에 대한 시간당 급여를받습니다. 

급여 프로그램은 직원 이름과 급여가 포함된 급여를 인쇄해야 합니다. 

Employee 급여 프로그램을 모델링하기 위해, FulltimeEmployee, HourlyEmployee,Payroll 같은 클래스를 만들 있습니다.

프로그램을 구조화하기 위해 클래스가 별도의 모듈(파일) 배치하여 사용합니다.

 

The Employee class

 employee.py

from abc import ABC, abstractmethod


class Employee(ABC):
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

    @property
    def full_name(self):
        return f"{self.first_name} {self.last_name}"

    @abstractmethod
    def get_salary(self):
        pass

 

The FulltimeEmployee class

fulltimeemployee.py

class FulltimeEmployee(Employee):
    def __init__(self, first_name, last_name, salary):
        super().__init__(first_name, last_name)
        self.salary = salary

    def get_salary(self):
        return self.salary

 

The HourlyEmployee class

hourlyemployee.py

class HourlyEmployee(Employee):
    def __init__(self, first_name, last_name, worked_hours, rate):
        super().__init__(first_name, last_name)
        self.worked_hours = worked_hours
        self.rate = rate

    def get_salary(self):
        return self.worked_hours * self.rate

 

The Payroll class

payroll.py

class Payroll:
    def __init__(self):
        self.employee_list = []

    def add(self, employee):
        self.employee_list.append(employee)

    def print(self):
        for e in self.employee_list:
            print(f"{e.full_name} \t ${e.get_salary()}")

 

The main program

app.py

from fulltimeemployee import FulltimeEmployee
from hourlyemployee import HourlyEmployee
from payroll import Payroll

payroll = Payroll()

payroll.add(FulltimeEmployee('John', 'Doe', 6000))
payroll.add(FulltimeEmployee('Jane', 'Doe', 6500))
payroll.add(HourlyEmployee('Jenifer', 'Smith', 200, 50))
payroll.add(HourlyEmployee('David', 'Wilson', 150, 100))
payroll.add(HourlyEmployee('Kevin', 'Miller', 100, 150))

payroll.print()

 

Output:

 

John Doe         $6000
Jane Doe         $6500
Jenifer Smith    $10000
David Wilson     $15000
Kevin Miller     $15000

 

추상 클래스를 사용하는 경우

실제로 추상 클래스를 사용하여 밀접하게 관련된 여러 클래스 간에 코드를 공유합니다. 급여 프로그램에서 Employee클래스의 모든 하위 클래스는 동일한 full_name속성을 공유합니다.

 

Summary

  • 추상 클래스는 인스턴스를 만들 수 없는 클래스입니다.
  • abc 모듈을 사용하여 추상 클래스를 정의하십시오.
payroll.py
0.00MB

 

api.py
0.00MB

 

employee.py
0.00MB

 

hourlyemployee.py
0.00MB
 

fulltimeemployee.py
0.00MB

'Python Object-oriented Programming' 카테고리의 다른 글

Metaclass  (0) 2023.04.01
type Class  (0) 2023.04.01
super() Method  (0) 2023.03.31
Static Methods  (0) 2023.03.31
__new__() Method  (0) 2023.03.31

댓글