将String转换为类变量名



我的问题如下:我在Python中创建了一个类,让我们想象它是一个具有属性,级别等的字符…

我还创建了一个字典,其中列出了所有角色的名称和属性,字典的键是角色的名称。

我想创建一个函数,它接受字典的参数,并创建字符作为我的类的实例。问题是,我不知道如何给我的变量的字符名称,我只有通过收集键对应他的名字的字符串。

的例子:

class Character():
def __init__(self,Name,Age):
self.Nom=Name
self.Age=Age

List_Character= {"Roger" : 36, "Kimberley" : 98} 

如何创建一个函数,该函数接受List_Character并返回变量名为Roger和Kimberley的两个Character实例?

尝试如下:

class Character():
def __init__(self,Name,Age):
self.Nom=Name
self.Age=Age

def __repr__(self):
return f"{self.__class__.__name__}(Name={self.Nom}, Age={self.Age})"

List_Character= {"Roger" : 36, "Kimberley" : 98}
def create_instance(cls, params: dict):
ret = ()
for k,v in params.items():
globals()[k] = cls(k, v)
ret = ret + (globals()[k],)
return ret
>>> create_instance(Character, List_Character)
(Character(Name=Roger, Age=36), Character(Name=Kimberley, Age=98))
>>> Roger
Character(Name=Roger, Age=36)
>>> Kimberley
Character(Name=Kimberley, Age=98)

虽然__repr__方法不是严格必需的,但没有它代码也会一样工作,它只是提供了更好的表示。

使用itertools.starmap可以缩短/优化功能:

from itertools import starmap
def create_instance(cls, params: dict):
keys, vals = params.keys(), tuple(starmap(cls, params.items()))
globals().update(dict(zip(keys, vals)))
return vals

您所需要做的就是遍历您的字典并从中创建新字符,将它们附加到列表中并返回此列表:

class Character():
def __init__(self,Name,Age):
self.Nom=Name
self.Age=Age

List_Character= {"Roger" : 36, "Kimberley" : 98}
def create_characters(char_dict):
return_list = []
for k,v in char_dict.items():
return_list.append(Character(k,v))
return return_list
print(create_characters(List_Character)[0].Nom, create_characters(List_Character)[0].Age)

的回报:

Roger 36

我假定"返回两个实例"你指的是一个包含所有实例的列表,对吧?因为我猜你不只是想要2个实例,而是要尽可能多地使用字典作为输入。

#编辑:如果您想通过名称访问字符,您可以使用字典:

def create_characters(char_dict):
return_dict = dict()
for k,v in char_dict.items():
return_dict[k] = Character(k,v)
return return_dict
dict_of_chars = create_characters(List_Character)
print(dict_of_chars["Roger"].Age)

最新更新