You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以数组中的元素符号为名称创建对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:20:03