如何从字符串生成变量?用函数创建指定名称的bankacc类实例
解决方案:动态创建变量与类实例
一、字符串转为变量的通用实现
直接生成全局变量可以用Python的globals()字典(它存储了全局命名空间的所有变量),实现起来很简单:
def createNewVariable(name, value): # 把变量名作为键,值作为对应内容存入全局命名空间 globals()[name] = value # 调用测试 createNewVariable("Var1", 20) print(Var1) # 输出 20
不过要注意:直接操作全局变量并不推荐,因为容易导致命名冲突,代码可读性和维护性变差。更稳妥的方式是用一个自定义字典来管理这些动态创建的“变量”:
custom_vars = {} def createNewVariable(name, value): custom_vars[name] = value createNewVariable("Var1", 20) print(custom_vars["Var1"]) # 输出 20
二、创建指定名称的bankacc类实例问题
你的原有代码无法生效,是因为函数里的Name是局部变量,函数执行结束后这个变量就会被销毁,根本没关联到全局的Peter变量。这里有两种可行的解决方式:
方式1:通过globals()创建全局实例
修改你的createbankacc函数,直接把实例存入全局命名空间:
class bankacc: balance = 0 number = 0 def __init__(self, balance, number): self.balance = balance self.number = number def pay(self, value): self.balance = self.balance + value def createbankacc(Name, Balance, Number): # 将实例存入全局命名空间,键为传入的Name字符串 globals()[Name] = bankacc(Balance, Number) # 调用测试 createbankacc("Peter", 100, 1) Peter.pay(50) print(Peter.balance) # 输出 150
方式2:用字典统一管理账户(推荐)
和前面的思路一样,用字典来存储所有账户实例,避免污染全局命名空间,还能方便地管理所有账户:
class bankacc: balance = 0 number = 0 def __init__(self, balance, number): self.balance = balance self.number = number def pay(self, value): self.balance = self.balance + value # 创建一个字典来管理所有银行账户 bank_accounts = {} def createbankacc(Name, Balance, Number): bank_accounts[Name] = bankacc(Balance, Number) # 调用测试 createbankacc("Peter", 100, 1) bank_accounts["Peter"].pay(50) print(bank_accounts["Peter"].balance) # 输出 150 # 还能轻松遍历所有账户 for name, account in bank_accounts.items(): print(f"账户{name}:余额{account.balance},账号{account.number}")
这种方式更符合Python的最佳实践,代码更清晰,也更容易排查问题。
内容的提问来源于stack exchange,提问作者ProProgrammee
相关产品推荐
相关产品推荐

