作者:aizhezhe | 来源:互联网 | 2022-12-01 20:01
我希望能够基于枚举类创建对象,并使用字典。像这样:
class IngredientType(Enum):
SPAM = auto() # Some spam
BAKE_BEANS = auto() # Baked beans
EGG = auto() # Fried egg
class Ingredient(object):
pass
class Spam(Ingredient):
pass
class BakedBeans(Ingredient):
pass
class Egg(Ingredient):
pass
class IngredientFactory(object):
"""Factory makes ingredients"""
choice = {
IngredientType.SPAM: IngredientFactory.MakeSpam,
IngredientType.BAKED_BEANS: IngredientFactory.MakeBakedBeans,
IngredientType.EGG: IngredientFactory.MakeEgg
}
@staticmethod
def make(type):
method = choice[type]
return method()
@staticmethod
def makeSpam():
return Spam()
@staticmethod
def makeBakedBeans():
return BakedBeans()
@staticmethod
def makeEgg():
return Egg()
但是我得到了错误:
NameError: name 'IngredientFactory' is not defined
由于某些原因,无法创建字典。我在哪里错了?
1> bruno desthu..:
Python不是Java,不需要将所有内容都放在类中。在这里,您的IngredientFactory
类没有状态,只有静态方法,因此它实际上只是一个单例名称空间,在python中,使用模块作为单例名称空间和普通函数可以正常完成此操作。另外,由于Python类已经可以调用,因此将实例化包装在函数中没有任何意义。简单,直接的pythonic实现是:
# ingredients.py
class IngredientType(Enum):
SPAM = auto() # Some spam
BAKE_BEANS = auto() # Baked beans
EGG = auto() # Fried egg
class Ingredient(object):
pass
class Spam(Ingredient):
pass
class Beans(Ingredient):
pass
class Egg(Ingredient):
pass
_choice = {
IngredientType.SPAM: Spam,
IngredientType.BAKED_BEANS: Beans,
IngredientType.EGG: Egg
}
def make(ingredient_type):
cls = _choice[ingredient_type]
return cls()
和客户端代码:
import ingredients
egg = ingredients.make(ingredients.IngredientType.EGG)
# or much more simply:
egg = ingredients.Egg()
FWIW IngredientType
枚举在这里并没有带来太多好处,甚至使事情变得更加复杂-您可以使用简单的字符串:
# ingredients.py
class Ingredient(object):
pass
class Spam(Ingredient):
pass
class Beans(Ingredient):
pass
class Egg(Ingredient):
pass
_choice = {
"spam": Spam,
"beans": Beans,
"egg": Egg
}
def make(ingredient_type):
cls = _choice[ingredient_type]
return cls()
和客户端代码:
import ingredients
egg = ingredients.make("egg")
或者,如果您确实要使用an Enum
,则可以至少choices
按照MadPhysicist的建议,通过将类本身用作枚举的值来摆脱字典:
# ingredients.py
class Ingredient(object):
pass
class Spam(Ingredient):
pass
class Beans(Ingredient):
pass
class Egg(Ingredient):
pass
class IngredientType(Enum):
SPAM = Spam
BEANS = Beans
EGG = Egg
@staticmethod
def make(ingredient_type):
return ingredient_type.value()
和客户端代码
from ingredients import IngredientType
egg = IngredientType.make(IngredientType.EGG)
但我真的也看不到任何好处
编辑:您提到:
我试图实现工厂模式,以隐藏对象的创建。然后,工厂的用户无需了解具体类型就可以处理“成分”
用户仍然必须指定他想要哪种食材(ingredient_type
参数),因此我不确定我是否了解这里的好处。您实际的用例是什么?(编造/精简示例的问题在于它们无法说明全部内容)。