Python 如何使用变量调用类?

Python 如何使用变量调用类?,python,Python,代码: 我想使用用户输入来决定调用哪个Mega,但我找不到方法。如果输入为“Ropher”,则让它打印Ropher的名称和类型,如果输入为“Mijek”,则打印Mijek的名称。有人能帮忙吗?你想要的是一本字典: class Mega: def __init__(self, name, types, moves): self.name = name self.types = types self.moves = moves rophe

代码:


我想使用用户输入来决定调用哪个Mega,但我找不到方法。如果输入为“Ropher”,则让它打印Ropher的名称和类型,如果输入为“Mijek”,则打印Mijek的名称。有人能帮忙吗?

你想要的是一本字典:

class Mega:
    def __init__(self, name, types, moves):
        self.name = name
        self.types = types
        self.moves = moves
  
ropher=Mega('Ropher', 'Sound', ['Screech', 'Coil'])
mijek=Mega('Mijek', 'Light', ['Solar Beam', 'Healing Sunlight'])

input=input('What mega? ').lower
print(f"your mega is {input.name}, a {input.types} type")
class Mega:
    def __init__(self, name, types, moves):
        self.name = name
        self.types = types
        self.moves = moves

megas = {'ropher': Mega('Ropher', 'Sound', ['Screech', 'Coil']),
         'mijik': Mega('Mijek', 'Light', ['Solar Beam', 'Healing Sunlight'])}

key = input('What mega? ').lower()
print(f"your mega is {megas[key].name}, a {megas[key].types} type")

你想要的是一本字典:

class Mega:
    def __init__(self, name, types, moves):
        self.name = name
        self.types = types
        self.moves = moves
  
ropher=Mega('Ropher', 'Sound', ['Screech', 'Coil'])
mijek=Mega('Mijek', 'Light', ['Solar Beam', 'Healing Sunlight'])

input=input('What mega? ').lower
print(f"your mega is {input.name}, a {input.types} type")
class Mega:
    def __init__(self, name, types, moves):
        self.name = name
        self.types = types
        self.moves = moves

megas = {'ropher': Mega('Ropher', 'Sound', ['Screech', 'Coil']),
         'mijik': Mega('Mijek', 'Light', ['Solar Beam', 'Healing Sunlight'])}

key = input('What mega? ').lower()
print(f"your mega is {megas[key].name}, a {megas[key].types} type")

最好使用字典而不是单独的变量。然后使用字典查找来查找所需的字典

megas = {
    'ropher': Mega('Ropher', 'Sound', ['Screech', 'Coil']),
    'mijek': Mega('Mijek', 'Light', ['Solar Beam', 'Healing Sunlight']),
}

input=megas[input('What mega? ').lower()]
print(f"your mega is {input.name}, a {input.types} type")
您也不应该调用变量输入,因为您重写了内置函数。在上面,我将其重命名为key

请注意,如果您试图查找的密钥在字典中不存在,则您的程序将因密钥错误而停止。如果要防止出现这种情况,可以首先使用in检查输入是否作为字典中的键之一存在:

class Mega:
    def __init__(self, name, types, moves):
        self.name = name
        self.types = types
        self.moves = moves
  
ropher=Mega('Ropher', 'Sound', ['Screech', 'Coil'])
mijek=Mega('Mijek', 'Light', ['Solar Beam', 'Healing Sunlight'])

input=input('What mega? ').lower
print(f"your mega is {input.name}, a {input.types} type")
class Mega:
    def __init__(self, name, types, moves):
        self.name = name
        self.types = types
        self.moves = moves

megas = {'ropher': Mega('Ropher', 'Sound', ['Screech', 'Coil']),
         'mijik': Mega('Mijek', 'Light', ['Solar Beam', 'Healing Sunlight'])}

key = input('What mega? ').lower()
print(f"your mega is {megas[key].name}, a {megas[key].types} type")
或者,您可以捕获KeyError:


最好使用字典而不是单独的变量。然后使用字典查找来查找所需的字典

megas = {
    'ropher': Mega('Ropher', 'Sound', ['Screech', 'Coil']),
    'mijek': Mega('Mijek', 'Light', ['Solar Beam', 'Healing Sunlight']),
}

input=megas[input('What mega? ').lower()]
print(f"your mega is {input.name}, a {input.types} type")
您也不应该调用变量输入,因为您重写了内置函数。在上面,我将其重命名为key

请注意,如果您试图查找的密钥在字典中不存在,则您的程序将因密钥错误而停止。如果要防止出现这种情况,可以首先使用in检查输入是否作为字典中的键之一存在:

class Mega:
    def __init__(self, name, types, moves):
        self.name = name
        self.types = types
        self.moves = moves
  
ropher=Mega('Ropher', 'Sound', ['Screech', 'Coil'])
mijek=Mega('Mijek', 'Light', ['Solar Beam', 'Healing Sunlight'])

input=input('What mega? ').lower
print(f"your mega is {input.name}, a {input.types} type")
class Mega:
    def __init__(self, name, types, moves):
        self.name = name
        self.types = types
        self.moves = moves

megas = {'ropher': Mega('Ropher', 'Sound', ['Screech', 'Coil']),
         'mijik': Mega('Mijek', 'Light', ['Solar Beam', 'Healing Sunlight'])}

key = input('What mega? ').lower()
print(f"your mega is {megas[key].name}, a {megas[key].types} type")
或者,您可以捕获KeyError:


您有多个要通过公共特征查找的对象。在本例中,小写的名称。您可以使用dict按名称索引对象,然后方便地在以后查找它们

try:
    print(f"your mega is {megas[key].name}, a {megas[key].types} type")
except KeyError:
    print("not a valid mega")

这只是冰山一角。你根本不需要那些ropher和mijek变量。它们在字典中,现在可以动态操作。

您有多个对象,希望通过一个公共功能查找它们。在本例中,小写的名称。您可以使用dict按名称索引对象,然后方便地在以后查找它们

try:
    print(f"your mega is {megas[key].name}, a {megas[key].types} type")
except KeyError:
    print("not a valid mega")

这只是冰山一角。你根本不需要那些ropher和mijek变量。它们在字典中,现在可以动态操作。

您应该使用dict作为数据容器,而不是变量。在运行时通过字符串名访问变量是一种黑客行为,不应该用于此目的;您可以实例化它。但你问的并不是这个;您正试图使用用户输入的字符串来选择程序中的现有对象。这与所讨论的课程无关。既然eval如此危险,为什么每种语言都有eval呢?在python中也有exec。@VisheshMangla,因为很少有情况下使用eval是合理的解决方案,但您应该知道自己在做什么,以及如何最大限度地降低风险。@VisheshMangla动态代码执行只有在输入不可信的情况下才是危险的。然而,通常情况下,问题是有人用完全错误的方式组织他们的代码,而不是数据结构,他们用变量来考虑一切。变量用于编写源代码,在几乎所有情况下,当有人问这样的问题时,OP应该使用某种容器,如列表或dict,不要只在全局范围内动态创建变量,因为全局范围很脆弱,很难解释。应该使用dict作为数据容器,而不是变量。在运行时通过字符串名访问变量是一种黑客行为,不应该用于此目的;您可以实例化它。但你问的并不是这个;您正试图使用用户输入的字符串来选择程序中的现有对象。这与所讨论的课程无关。既然eval如此危险,为什么每种语言都有eval呢?在python中也有exec。@VisheshMangla,因为很少有情况下使用eval是合理的解决方案,但您应该知道自己在做什么,以及如何最大限度地降低风险。@VisheshMangla动态代码执行只有在输入不可信的情况下才是危险的。然而,通常情况下,问题是有人用完全错误的方式组织他们的代码,而不是数据结构,他们用变量来考虑一切。变量是用来编写源代码的,几乎在任何情况下,当有人问这样的问题时,OP都应该使用某种容器,如列表或dict,而不是仅仅在全局范围内动态创建变量,这是非常脆弱和难以推理的。