Python实现周期表时批量创建元素类实例的高效方法咨询
Python实现周期表时批量创建元素类实例的高效方法咨询
嘿,我完全懂你现在的麻烦——手动给每个元素写那么长的实例化代码简直是重复劳动,要是要做完整的周期表,100多个元素得写到天荒地老。咱们来把你的代码改得更高效,彻底摆脱这种繁琐的手动操作!
核心优化思路:数据驱动 + 简化类设计
我们可以把元素属性数据和代码逻辑分开,用结构化数据来存储所有元素的信息,再通过循环批量创建实例;同时用Python的dataclasses来简化你的类定义,砍掉冗余的样板代码。
1. 用dataclasses简化元素类定义
你原来的elements类里的__init__方法全是重复的赋值代码,用dataclasses可以一键搞定,代码会简洁很多:
from dataclasses import dataclass def gs(x): normal = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-=()" super_s = "ᴬᴮᶜᴰᴱᶠᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾQᴿˢᵀᵁⱽᵂˣʸᶻᵃᵇᶜᵈᵉᶠᵍʰᶦʲᵏˡᵐⁿᵒᵖ۹ʳˢᵗᵘᵛʷˣʸᶻ⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾" res1 = x.maketrans(normal, super_s) return x.translate(res1) # 用dataclass替代手写__init__,自动生成属性赋值逻辑 @dataclass class Element: name: str symbol: str atomic_number: int atomic_weight: str state: str melting_point: str boiling_point: str oxidation_states: str electron_config: str atomic_radius: str electronegativity: str valence_electrons: int # 保留你原来的properties方法,格式更易读 def properties(self): print( f"Name: {self.name}\nSymbol: {self.symbol}\nAtomic Number: {self.atomic_number}\n" f"Atomic Weight: {self.atomic_weight}\nState/Classification: {self.state}\n" f"Melting Point: {self.melting_point}\nBoiling Point: {self.boiling_point}\n" f"Oxidation States: {self.oxidation_states}\nElectron Configuration: {self.electron_config}\n" f"Atomic Radius: {self.atomic_radius}\nElectronegativity: {self.electronegativity}\n" f"Valence Electrons: {self.valence_electrons}" )
2. 用结构化数据存储元素信息,批量创建实例
把所有元素的属性整理成列表(后续还可以存在CSV/JSON文件里,方便管理大量数据),然后循环创建实例,用一个字典来存储所有元素(替代原来依赖locals()的方式,更安全可靠):
# 整理元素数据:每个元素是一个字典,键对应Element类的字段 elements_data = [ { "name": "Hydrogen", "symbol": "H", "atomic_number": 1, "atomic_weight": "1.008u", "state": "Gas (Reactive nonmetal)", "melting_point": "-259.1ᵒC", "boiling_point": "-252.76ᵒC", "oxidation_states": "±1", "electron_config": f"1s{gs('1')}", "atomic_radius": "37pm", "electronegativity": "2.18", "valence_electrons": 1 }, { "name": "Helium", "symbol": "He", "atomic_number": 2, "atomic_weight": "4.002602u", "state": "Gas (Noble gas)", "melting_point": "-268.93ᵒC", "boiling_point": "N/A", "oxidation_states": "0", "electron_config": f"1s{gs('2')}", "atomic_radius": "31pm", "electronegativity": "N/A", "valence_electrons": 2 } # 后续加其他元素,只需要在这里加对应的字典就行,不用写重复的实例化代码! ] # 批量创建元素实例,存在字典里:键用元素名称小写,方便查询 elements_dict = {} for elem_data in elements_data: elem = Element(**elem_data) elements_dict[elem.name.lower()] = elem
3. 优化查询逻辑,用字典替代locals()
修改你的查询循环,直接用elements_dict查找,比依赖locals()更稳定:
while True: select = input("Select the element by name: ").strip().lower() if select in elements_dict: elements_dict[select].properties() elif select == 'h': hc = input("Please select the number that corresponds to your problem: \n1. Don't know how to spell the element \n2. Info is incorrect \n3. Cancel \n").strip() if hc == '1': # 这里可以后续加元素名称列表提示,现在先保留你的"Filler" print("Filler") elif hc == '2': print("Please go to this google forms to report problem") elif hc == '3': continue else: print("Element not found \nType 'h' if you need help")
为什么这样优化?
- 数据驱动:后续添加新元素只需要在
elements_data里加一个字典,不用写重复的elements(...)代码,100多个元素也能轻松搞定 - 简化类定义:
dataclass帮你自动生成__init__、__repr__等方法,砍掉了大量样板代码,类的定义更清晰 - 更安全的实例存储:用
elements_dict存储实例,比依赖locals()查找更可靠,不会和局部变量产生冲突,也更易维护
如果你的元素数据很多,还可以把elements_data存成JSON/CSV文件,然后用json.load()或者csv.reader()读取数据,这样管理大量元素数据会更方便,不用把所有数据都写在代码里。
备注:内容来源于stack exchange,提问作者1nonly
相关产品推荐
相关产品推荐

