簡體   English   中英

將字符串轉換為 class 變量名

[英]Turn a String into class variable name

我的問題如下:我在 Python 中創建了一個 class 讓我們想象它是一個具有統計數據、級別等的角色......

我還創建了一個字典,其中列出了所有字符名稱和統計信息,字典的鍵是字符的名稱。

我想創建一個 function,它接受字典參數並將字符創建為我的 class 的實例。 問題是我不知道如何將字符名稱賦予我的變量,我只有通過收集密鑰得到與他的名字相對應的字符串。

例子:

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


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


如何創建一個 function,它采用 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__方法不是絕對必要的,但沒有它,代碼仍然可以工作,它只是提供了更好的表示。

function 可以使用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

您需要做的就是遍歷您的 dict 並從中創建新字符,append 將它們放入一個列表並返回此列表:

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 個實例,而且還希望將其用作輸入的 dict 中的數量。

#Edit:如果您想按名稱訪問字符,您可以使用 dict :

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM