能否将Python类参数作为函数参数传入?类方法优化问询
Python军队类插槽优化方案
问题背景
我正在编写一个Python类,包含army_name、slot_1这类参数,想通过方法修改指定的类参数,把目标参数作为方法传入参数。现有代码如下:
class Army: def __init__(self, army_name, slot_1=None): self.army_name = army_name self.slot_1 = slot_1 def add_unit_to_army(self, unit, count, slot_number): if slot_number == 1 and self.slot_1 is None: self.slot_1 = {unit: count}
但插槽数量多了会产生大量elif分支,想直接把slot_1这类参数作为方法参数调用,比如:
a = Army('new Army') a.add_unit_to_army('skeleton', 33, slot_13) a.add_unit_to_army('skeleton', 33, slot_34)
可行解决方案
方案1:通过属性名字符串操作插槽
直接传入插槽的属性名字符串(比如"slot_13"),利用Python的getattr和setattr函数动态操作实例属性,彻底避免大量分支判断:
class Army: def __init__(self, army_name, **slots): self.army_name = army_name # 初始化指定范围的插槽,支持传入初始值 max_slot = 34 # 根据需求调整最大插槽数 for slot_num in range(1, max_slot + 1): slot_name = f"slot_{slot_num}" setattr(self, slot_name, slots.get(slot_name)) def add_unit_to_army(self, unit, count, slot_attr): # 检查插槽是否存在且未被占用 if hasattr(self, slot_attr) and getattr(self, slot_attr) is None: setattr(self, slot_attr, {unit: count}) # 调用示例 a = Army('new Army') a.add_unit_to_army('skeleton', 33, "slot_13") a.add_unit_to_army('skeleton', 33, "slot_34")
这种方式不管插槽数量多少,代码结构都不会变,初始化时还能通过**slots灵活传入部分插槽的初始值。
方案2:改用字典存储插槽(更推荐)
如果插槽数量较多,单独定义slot_1、slot_2这类实例属性会非常冗余,改用字典统一管理所有插槽是更简洁的方案:
class Army: def __init__(self, army_name, slot_count=34): self.army_name = army_name # 初始化插槽字典,键为插槽编号,值为None表示未占用 self.slots = {i: None for i in range(1, slot_count + 1)} def add_unit_to_army(self, unit, count, slot_number): # 检查插槽是否存在且未被占用 if slot_number in self.slots and self.slots[slot_number] is None: self.slots[slot_number] = {unit: count} # 调用示例 a = Army('new Army') a.add_unit_to_army('skeleton', 33, 13) a.add_unit_to_army('skeleton', 33, 34)
这种方式维护成本更低,后续要调整插槽数量、批量操作插槽或者扩展功能(比如清空插槽)都更方便,不用修改类的属性定义。
关于直接传入slot_13这类变量的说明
你示例中想直接传slot_13的方式不可行——因为slot_13是实例的属性,你需要先通过a.slot_13获取它,但这传递的是属性的值,不是属性本身,无法定位到对应的插槽。所以直接传属性名字符串或插槽编号才是合理的做法。
内容的提问来源于stack exchange,提问作者tiraksor
相关产品推荐
相关产品推荐

