추상 클래스와 메서드
Coddy Python 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 64개 중 25번째.
추상 클래스는 직접 인스턴스화할 수 없으며, 하위 클래스에서 구현해야 하는 추상 메서드를 포함하는 클래스입니다.
양식에 비유해 보세요: 추상 클래스는 필수 항목(추상 메서드)과 선택 항목(구체 메서드)이 있는 필수 양식 코드와 같습니다. 양식 자체를 제출할 수는 없습니다. 먼저 모든 필수 항목을 작성해야 합니다. 마찬가지로, 추상 메서드를 모두 하위 클래스에서 구현하기 전까지는 추상 클래스의 인스턴스를 만들 수 없습니다.
추상 클래스를 만들려면 abc 모듈을 가져오세요.
from abc import ABC, abstractmethod추상 메서드를 포함하는 추상 클래스를 만드세요.
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
def describe(self):
return "This is a shape" # 구현이 있는 구체 메서드@abstractmethod 데코레이터는 하위 클래스에서 반드시 구현해야 하는 메서드를 표시합니다. 이는 양식의 “필수 입력란”입니다. describe()와 같은 일반 메서드는 구현을 포함할 수 있으며 그대로 상속됩니다. 이는 “미리 채워진 입력란”입니다.
추상 클래스를 사용하는 이유는 무엇일까요? 추상 클래스는 계약을 강제합니다. Shape 클래스를 만든다는 것은 “모든 도형은 넓이와 둘레를 계산할 수 있어야 한다”고 선언하는 것입니다. 이렇게 하면 중요한 메서드를 구현하는 것을 잊어버려 발생할 수 있는 버그를 방지할 수 있습니다.
추상 클래스의 인스턴스를 만들어 보세요:
# 이렇게 하면 오류가 발생합니다:
# shape = Shape() # TypeError: 추상 클래스를 인스턴스화할 수 없음이 오류는 의도된 것입니다. 빈 양식을 제출하려는 것과 같습니다. Python은 "필수 항목(면적 및 둘레 메서드)을 아직 작성하지 않았습니다!"라고 알려 주는 것입니다.
모든 추상 메서드를 구현하는 구체적인 서브클래스를 만드세요.
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
def perimeter(self):
return 2 * 3.14 * self.radius이제 “필요한 모든 필드를 채웠습니다.” area()와 perimeter()를 모두 구현했습니다. 이제 Circle 클래스는 인스턴스화할 수 있는 완전한 구체 클래스입니다.
이제 구체 클래스의 인스턴스를 만들 수 있습니다:
circle = Circle(5)
print(circle.area())
print(circle.perimeter())
print(circle.describe()) # 상속받은 구체 메서드또 다른 구체적인 하위 클래스를 만드세요:
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width self.height
def perimeter(self):
return 2 * (self.width + self.height)
rectangle = Rectangle(4, 6)
print(rectangle.area())
print(rectangle.perimeter())출력:
78.5
31.400000000000002
This is a shape
24
20추상 클래스는 하위 클래스가 따라야 하는 계약을 정의합니다. ABC와 @abstractmethod를 사용해 추상 클래스를 만드세요. 하위 클래스는 모든 추상 메서드를 구현해야 합니다. 그렇지 않으면 해당 클래스도 추상 클래스가 됩니다. 이렇게 하면 일관성을 유지하고 불완전한 구현을 방지할 수 있습니다.
챌린지
중급이 챌린지에서는 결제 처리 시스템을 구현합니다.
다음 파일의 구현을 완성해야 합니다.
paymentmethod.py- 유효성 검사 로직이 포함된 추상 기본 클래스creditcard.py- 신용카드 결제 구현paypal.py- PayPal 결제 구현
각 파일의 TODO 주석을 따라 필요한 기능을 구현하세요. 주석은 추상 메서드 생성, 구체적인 하위 클래스 구현, 파일 간 적절한 import 관계 설정 과정을 단계별로 안내합니다.
driver.py 파일에는 구현이 올바르게 작동하는지 확인하고, 다양한 결제 시나리오를 처리하며 각 결제 수단에 적절한 세부 정보를 표시하는 테스트 사례가 포함되어 있습니다.
직접 해보기
from creditcard import CreditCard
from paypal import PayPal
# 구현을 테스트합니다 - 이 테스트 코드를 수정하지 마세요
cc = CreditCard("1234567890123456")
pp = PayPal("user@example.com")
# 유효한 결제를 처리합니다
if cc.validate(100):
print(cc.process_payment(100))
print(cc.payment_details())
if pp.validate(200):
print(pp.process_payment(200))
print(pp.payment_details())
# 유효하지 않은 금액을 시도합니다
if not pp.validate(0):
print("Invalid payment amount")
# 주석을 해제하면 오류가 발생합니다:
# pm = PaymentMethod() # 추상 클래스는 인스턴스화할 수 없습니다이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Python 컴파일러