如何以数组中的元素符号为名称创建对应Python对象?
批量创建元素符号命名的对象解决方案
问题背景
我有一个存储周期表元素符号的数组,另一个数组存储元素的所有属性。希望以每个元素符号为名称创建对应对象,并赋予另一数组中的属性。已编写Elemento类和单元素创建代码,但需要批量实现如H.NumAtomico这样的调用效果。
已尝试的代码:
import pandas as pd file = '/path/to/file/PeriodicTableofElements.csv' df = pd.read_csv(file) class Elemento: def __init__(self, NumAtomico, Elemento, Simbolo, MassAtomica, Neutrones, Protones, Electrones, Periodo, Grupo, Fase, radioctividad, Natural, Metal, NoMetal, Metaloide, Tipo, RadioAtomico, electronegatividad, PrimeraIonizacion, densidad, Fusion, Evaporacion, CantIsotopos, Descubridor, Año, CalorEspecifico, NumOrbitas, NumVale ): self.NumAtomico = NumAtomico self.Elemento = Elemento self.Simbolo = Simbolo self.MassAtomica = MassAtomica self.Neutrones = Neutrones self.Protones = Protones self.Electrones = Electrones self.Periodo = Periodo self.Grupo = Grupo self.Fase = Fase self.radioctividad = radioctividad self.Natural = Natural self.Metal = Metal self.NoMetal = NoMetal self.Metaloide = Metaloide self.Tipo = Tipo self.RadioAtomico = RadioAtomico self.electronegatividad = electronegatividad self.PrimeraIonizacion = PrimeraIonizacion self.densidad = densidad self.Fusion = Fusion self.Evaporacion = Evaporacion self.CantIsotopos = CantIsotopos self.Descubridor = Descubridor self.Año = Año self.CalorEspecifico = CalorEspecifico self.NumOrbitas = NumOrbitas self.NumVale = NumVale def CrearElemento(ListaAtributos): return Elemento(*ListaAtributos) simbolo = df['Symbol'].to_list() H = Elemento.CrearElemento(df.iloc[0].to_list())
解决方案
方法1:动态注入全局命名空间(直接实现H.NumAtomico调用)
通过globals()字典可以将元素对象以符号为名称直接添加到全局变量中,代码修改如下:
import pandas as pd file = '/path/to/file/PeriodicTableofElements.csv' df = pd.read_csv(file) class Elemento: def __init__(self, NumAtomico, Elemento, Simbolo, MassAtomica, Neutrones, Protones, Electrones, Periodo, Grupo, Fase, radioctividad, Natural, Metal, NoMetal, Metaloide, Tipo, RadioAtomico, electronegatividad, PrimeraIonizacion, densidad, Fusion, Evaporacion, CantIsotopos, Descubridor, Año, CalorEspecifico, NumOrbitas, NumVale ): self.NumAtomico = NumAtomico self.Elemento = Elemento self.Simbolo = Simbolo self.MassAtomica = MassAtomica self.Neutrones = Neutrones self.Protones = Protones self.Electrones = Electrones self.Periodo = Periodo self.Grupo = Grupo self.Fase = Fase self.radioctividad = radioctividad self.Natural = Natural self.Metal = Metal self.NoMetal = NoMetal self.Metaloide = Metaloide self.Tipo = Tipo self.RadioAtomico = RadioAtomico self.electronegatividad = electronegatividad self.PrimeraIonizacion = PrimeraIonizacion self.densidad = densidad self.Fusion = Fusion self.Evaporacion = Evaporacion self.CantIsotopos = CantIsotopos self.Descubridor = Descubridor self.Año = Año self.CalorEspecifico = CalorEspecifico self.NumOrbitas = NumOrbitas self.NumVale = NumVale # 批量创建元素对象 for index, row in df.iterrows(): # 转换行数据为列表,匹配__init__参数顺序 attrs = row.to_list() # 获取元素符号作为变量名 symbol = row['Symbol'] # 注入全局命名空间 globals()[symbol] = Elemento(*attrs) # 测试调用 print(H.NumAtomico) print(He.MassAtomica)
方法2:使用字典存储(更安全,避免命名冲突)
如果担心全局变量被污染,推荐用字典统一存储所有元素对象,通过elements['H'].NumAtomico的形式调用:
import pandas as pd file = '/path/to/file/PeriodicTableofElements.csv' df = pd.read_csv(file) class Elemento: def __init__(self, NumAtomico, Elemento, Simbolo, MassAtomica, Neutrones, Protones, Electrones, Periodo, Grupo, Fase, radioctividad, Natural, Metal, NoMetal, Metaloide, Tipo, RadioAtomico, electronegatividad, PrimeraIonizacion, densidad, Fusion, Evaporacion, CantIsotopos, Descubridor, Año, CalorEspecifico, NumOrbitas, NumVale ): self.NumAtomico = NumAtomico self.Elemento = Elemento self.Simbolo = Simbolo self.MassAtomica = MassAtomica self.Neutrones = Neutrones self.Protones = Protones self.Electrones = Electrones self.Periodo = Periodo self.Grupo = Grupo self.Fase = Fase self.radioctividad = radioctividad self.Natural = Natural self.Metal = Metal self.NoMetal = NoMetal self.Metaloide = Metaloide self.Tipo = Tipo self.RadioAtomico = RadioAtomico self.electronegatividad = electronegatividad self.PrimeraIonizacion = PrimeraIonizacion self.densidad = densidad self.Fusion = Fusion self.Evaporacion = Evaporacion self.CantIsotopos = CantIsotopos self.Descubridor = Descubridor self.Año = Año self.CalorEspecifico = CalorEspecifico self.NumOrbitas = NumOrbitas self.NumVale = NumVale # 创建字典存储所有元素 elements = {} for index, row in df.iterrows(): attrs = row.to_list() symbol = row['Symbol'] elements[symbol] = Elemento(*attrs) # 测试调用 print(elements['H'].NumAtomico) print(elements['C'].Grupo)
优化建议:简化Elemento类初始化
可以通过动态属性赋值简化冗长的__init__方法,无需手动编写所有参数:
class Elemento: def __init__(self, **kwargs): # 将传入的所有键值对设为实例属性 for key, value in kwargs.items(): setattr(self, key, value) # 批量创建时改用行的字典形式 for index, row in df.iterrows(): symbol = row['Symbol'] # 将行数据转为字典,键为CSV列名 element_attrs = row.to_dict() # 映射列名到自定义属性名(示例) element_attrs['Simbolo'] = element_attrs.pop('Symbol') element_attrs['NumAtomico'] = element_attrs.pop('AtomicNumber') # 其他列名映射按需添加... globals()[symbol] = Elemento(**element_attrs)
这种方式更灵活,后续CSV列有变动时无需修改__init__方法。
内容的提问来源于stack exchange,提问作者Soy_Asher
相关产品推荐
相关产品推荐

