【问题标题】:Creating different instances in a loop using a dictionary使用字典在循环中创建不同的实例
【发布时间】:2018-03-20 00:54:49
【问题描述】:

我希望用户定义一系列字符串

user_input = ('cat', 'cactus', 'cat')

对应于从可能对象的字典中实例化的一系列对象

classes = {
    'cat': Cat,
    'cactus': Cactus,
 }

CatCactus 对应于从父类继承的类

class Pet():
    ...

class Cat(Pet):
    def __init__(self, name, colour):
        Pet.__init__(self, name, colour)
        ...

class Cactus(Pet):
    def __init__(self, name, colour):
        Pet.__init__(self, name, colour)
        ...

我尝试将对象类型添加到列表中

pet_types = []
for i in range(0,3):
    try:
        pet_type.append(classes[user_input[i]])
    except:
        raise Exception('type no exist')

但是当我这样做时,当字符串与字典条目完全对应时,会引发异常告诉我“类型不存在”!为什么会这样?

然后我想像这样使用pet_types

pet_500 = pet_types[500](name,colour)

【问题讨论】:

  • 首先不要使用毯子try...except。引发的实际异常是什么?
  • 旁注:当你可以直接循环 user_input 时,不要循环 range()
  • 我认为您正在寻找工厂模式。 en.wikipedia.org/wiki/Factory_method_pattern

标签: python class oop dictionary instantiation


【解决方案1】:

捕捉任何异常 (except:) 是一种狡猾的做法,就像用自己隐藏原始异常一样,甚至不记录它。

在这种情况下,这两种狡猾做法的结合隐藏了您有错字的事实,并且您试图访问未定义的 pet_type(单数),而不是您实际拥有的变量 - pet_types(复数)。修复它,你应该会没事的。

【讨论】:

  • 是的,你是对的,这有点尴尬!它工作正常,没有抛出异常。以后我不会添加自定义异常了!!
猜你喜欢
  • 2016-09-06
  • 2023-01-17
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 2019-03-01
相关资源
最近更新 更多