如何将循环中的fun_name传入Fun类的map_list方法?
问题解决方案
先明确原代码的核心问题:你在初始化Fun对象时就调用了map_list(),但此时主程序的fun_name还没进入循环赋值,global关键字根本拿不到有效变量;而且类的设计没考虑到fun_name是动态变化的,每次循环都需要重新计算映射结果。下面给两种可行的修改方案:
方案一:将fun_name作为参数传递给方法
这种方式最直接,符合面向对象的封装原则,避免全局变量依赖:
class Fun: def __init__(self, user_input): # 把输入传入类初始化,避免依赖全局变量 self.converted_list = list(user_input) def map_list(self, fun_name): return list(map(lambda x: getattr(x, fun_name)(), self.converted_list)) def return_bool(self, fun_name): # 每次调用时根据当前fun_name重新计算映射结果 map_result = self.map_list(fun_name) for each_bool in map_result: if each_bool: return True return False if __name__ == '__main__': user_input = input() if 0 < len(user_input) < 1000: fun = Fun(user_input) fun_set = ['isalnum','isalpha','isdigit','islower','isupper'] for fun_name in fun_set: # 把当前循环的fun_name传入方法 print(fun.return_bool(fun_name))
方案二:将fun_name设为实例属性,循环时更新
如果希望保留类内部的属性传递逻辑,可以这样改:
class Fun: def __init__(self, user_input): self.converted_list = list(user_input) # 初始化实例属性存储方法名 self.fun_name = None def map_list(self): # 直接使用实例属性中的方法名 return list(map(lambda x: getattr(x, self.fun_name)(), self.converted_list)) def return_bool(self): map_result = self.map_list() for each_bool in map_result: if each_bool: return True return False if __name__ == '__main__': user_input = input() if 0 < len(user_input) < 1000: fun = Fun(user_input) fun_set = ['isalnum','isalpha','isdigit','islower','isupper'] for fun_name in fun_set: # 每次循环更新实例的fun_name属性 fun.fun_name = fun_name print(fun.return_bool())
为什么原global方式不可行?
你初始化fun = Fun()时,主程序的for循环还没开始,fun_name根本没被赋值,此时map_list()里的global fun_name要么找不到变量,要么拿到无效值。而且全局变量会让代码耦合性变高,不利于维护,不推荐使用。
内容的提问来源于stack exchange,提问作者Mango-danbi
相关产品推荐
相关产品推荐

