如何简化拥有大量参数的Python基类定义?
优化Python Champion类的简洁创建方式
我编写了如下类:
class Champion: def __init__(self, secondary_bar, secondary_attributes, health, health_reg, mana, mana_reg, c_range, att_damage, att_speed, armor, magic_res, move_speed): self.secondary_bar = secondary_bar self.secondary_attributes = secondary_attributes self.health = health self.health_reg = health_reg self.mana = mana self.mana_reg = mana_reg self.c_range = c_range self.att_damage = att_damage self.att_speed = att_speed self.armor = armor self.magic_res = magic_res self.move_speed = move_speed ... class SpecificChampion(Champion): ... my_champ = SpecificChampion("mana", "melee", 500, 20, 250, 20, 125, 50, 0.8, 65, 65, 320)我认为该基类占用空间过大,希望找到更简洁的创建方式。我曾尝试用kwargs将参数存入列表,但访问这些参数并传递给其他函数时十分混乱,请问有什么建议?
方案1:用dataclasses彻底简化类定义
Python 3.7+自带的dataclasses模块可以自动帮你生成__init__、__repr__等样板方法,既减少代码量,又能保持属性访问的直观性,完全解决kwargs带来的混乱问题:
from dataclasses import dataclass @dataclass class Champion: secondary_bar: str secondary_attributes: str health: int health_reg: int mana: int mana_reg: int c_range: int att_damage: int att_speed: float armor: int magic_res: int move_speed: int class SpecificChampion(Champion): # 这里添加子类特有的属性或方法即可 pass # 创建实例的写法和原来完全一致 my_champ = SpecificChampion("mana", "melee", 500, 20, 250, 20, 125, 50, 0.8, 65, 65, 320) # 访问属性依然直接清晰 print(my_champ.health) # 输出500
方案2:将属性分组为嵌套数据类
如果部分属性存在逻辑关联(比如生命值+生命回复、法力值+法力回复),可以把它们分组到嵌套的小数据类中,减少主类的参数数量,同时让结构更清晰:
from dataclasses import dataclass @dataclass class ResourceStats: value: int regen: int @dataclass class Champion: secondary_bar: str secondary_attributes: str health: ResourceStats mana: ResourceStats c_range: int att_damage: int att_speed: float armor: int magic_res: int move_speed: int class SpecificChampion(Champion): pass # 创建实例时按分组传入 my_champ = SpecificChampion( "mana", "melee", ResourceStats(500, 20), ResourceStats(250, 20), 125, 50, 0.8, 65, 65, 320 ) # 访问分组属性也很直观 print(my_champ.health.regen) # 输出20
方案3:规范使用kwargs(适合动态场景)
如果你确实需要kwargs的灵活性,可以结合dataclass的asdict方法来规范参数传递,避免混乱:
from dataclasses import dataclass, asdict @dataclass class Champion: secondary_bar: str secondary_attributes: str health: int health_reg: int mana: int mana_reg: int c_range: int att_damage: int att_speed: float armor: int magic_res: int move_speed: int class SpecificChampion(Champion): pass # 用字典组织参数 champ_params = { "secondary_bar": "mana", "secondary_attributes": "melee", "health": 500, "health_reg": 20, "mana": 250, "mana_reg": 20, "c_range": 125, "att_damage": 50, "att_speed": 0.8, "armor": 65, "magic_res": 65, "move_speed": 320 } my_champ = SpecificChampion(**champ_params) # 传递给其他函数时,用asdict解包保证结构规范 def process_champ_stats(**stats): print(f"当前生命值:{stats['health']}") process_champ_stats(**asdict(my_champ))
总结
最推荐方案1,用dataclasses在不损失可读性的前提下彻底简化类定义;如果需要强调属性的逻辑关联,方案2会让代码结构更合理;方案3适合需要动态生成实例的场景,但要注意保持参数字典的规范。
内容的提问来源于stack exchange,提问作者ecoH
相关产品推荐
相关产品推荐

