多态取代条件表达式举例
# 使用多态的实现
from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef calculate_area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef calculate_area(self):return 3.14 * self.radius ** 2class Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef calculate_area(self):return self.width * self.heightclass Triangle(Shape):def __init__(self, base, height):self.base = baseself.height = heightdef calculate_area(self):return 0.5 * self.base * self.height# 使用示例
circle = Circle(5)
rectangle = Rectangle(4, 6)
triangle = Triangle(3, 7)# 统一调用方式
shapes = [circle, rectangle, triangle]
for shape in shapes:print(f"{type(shape).__name__} 面积: {shape.calculate_area()}")
反例
这种实现方式存在一些缺点,比如代码冗长,每次新增一种形状都需要修改 calculate_area 函数,这违背了开闭原则
# 使用条件表达式的实现
class Shape:def __init__(self, shape_type, **kwargs):self.shape_type = shape_typeself.kwargs = kwargsdef calculate_area(shape):if shape.shape_type == "circle":radius = shape.kwargs.get("radius")return 3.14 * radius ** 2elif shape.shape_type == "rectangle":width = shape.kwargs.get("width")height = shape.kwargs.get("height")return width * heightelif shape.shape_type == "triangle":base = shape.kwargs.get("base")height = shape.kwargs.get("height")return 0.5 * base * heightelse:raise ValueError("未知形状")# 使用示例
circle = Shape("circle", radius=5)
rectangle = Shape("rectangle", width=4, height=6)
triangle = Shape("triangle", base=3, height=7)print(f"圆形面积: {calculate_area(circle)}")
print(f"矩形面积: {calculate_area(rectangle)}")
print(f"三角形面积: {calculate_area(triangle)}")