枚举适用于值的范围固定且有限的场景,核心价值是:
- 限制输入,避免无效值;
- 增强可读性,减少硬编码;
- 配合类型提示,提升开发效率。
在实际开发中,枚举常用于状态码、类型标识、选项列表等场景,是替代字符串 / 数字硬编码的最佳实践之一。
# 导入抽象基类模块,用于定义抽象类和抽象方法
from abc import ABC, abstractmethod
# 导入枚举模块,用于限制动物类型的可选值
from enum import Enum
class AnimalType(Enum):
"""
动物类型枚举类,明确限定工厂可创建的动物类型
避免直接使用字符串传参导致的拼写错误或无效值
"""
# 枚举成员:键为常量名,值为对应的字符串标识
CAT = "cat" # 猫类型
DOG = "dog" # 狗类型
class Animal(ABC):
"""
动物抽象基类(ABC),定义所有动物的通用接口
作为所有具体动物类的父类,强制子类实现speak方法
"""
@abstractmethod
def speak(self):
"""
抽象方法:动物发出叫声的接口
子类必须实现该方法,返回对应动物的叫声字符串
"""
pass
class Dog(Animal):
"""
狗类,继承自动物抽象基类
实现狗的具体叫声逻辑
"""
def speak(self):
"""返回狗的叫声"Woof!"(汪汪)"""
return "Woof!"
class Cat(Animal):
"""
猫类,继承自动物抽象基类
实现猫的具体叫声逻辑
"""
def speak(self):
"""返回猫的叫声"Meow!"(喵喵)"""
return "Meow!"
class AnimalFactory:
"""
动物工厂类,使用简单工厂模式创建动物实例
封装对象创建逻辑,根据输入的动物类型返回对应实例
"""
@staticmethod
def create(animal_type: AnimalType):
"""
静态工厂方法:根据动物类型枚举创建对应动物实例
:param animal_type: 动物类型枚举(AnimalType),只能是CAT或DOG
:return: 对应动物类型的实例(Dog或Cat)
:raises ValueError: 若传入未定义的枚举值(理论上因枚举限制不会触发)
"""
# 根据枚举值判断需要创建的动物类型
if animal_type == AnimalType.DOG:
return Dog() # 创建狗实例
elif animal_type == AnimalType.CAT:
return Cat() # 创建猫实例
else:
# 异常处理:应对枚举扩展后未更新工厂的情况
raise ValueError(f"不支持的动物类型: {animal_type}")
if __name__ == '__main__':
# -------------- 使用示例 --------------
# 创建狗实例并调用叫声方法
dog = AnimalFactory.create(AnimalType.DOG)
print(dog.speak()) # 输出:Woof!
# 创建猫实例并调用叫声方法
cat = AnimalFactory.create(AnimalType.CAT)
print(cat.speak()) # 输出:Meow!
优化点说明:
- 枚举限制输入:通过
AnimalType枚举,明确限定可选值只能是CAT或DOG,避免传入无效字符串(如 "bird"、"pig" 等)。 - 类型提示:
create方法的参数类型被标注为AnimalType,IDE 会自动提示可选值,减少开发错误。 - 可读性提升:使用枚举比直接传字符串更清晰,代码意图更明确。
如果尝试传入枚举外的值(如AnimalFactory.create("dog")),会直接触发类型错误,提前暴露问题。
1330

被折叠的 条评论
为什么被折叠?



