如何将字符串转为类属性变量名?self识别问题求解
问题解决:动态给类实例添加属性
你的问题出在**vars()不带参数时,操作的是当前函数的局部命名空间,不是实例的属性字典**。你写的vars()[f'self.table{1}']=10只是在__init__的局部变量里存了一个键为"self.table1"的变量,根本没给self实例添加属性,自然会报找不到table1的错误。
下面是两种正确的实现方式:
方法1:使用setattr()(推荐)
setattr()是Python专门用来动态设置对象属性的内置函数,用法简单且规范:
class Myclass: def __init__(self): setattr(self, f'table{1}', 10) def run(self): print(self.table1) myclass = Myclass() myclass.run() # 输出:10
方法2:直接操作实例的__dict__
每个实例的属性都存储在自身的__dict__字典中,你可以直接修改这个字典来添加属性:
class Myclass: def __init__(self): self.__dict__[f'table{1}'] = 10 def run(self): print(self.table1) myclass = Myclass() myclass.run() # 输出:10
补充:为什么原来的vars()、locals()、globals()不行?
vars()无参数时等价于locals(),返回当前函数的局部变量字典,和实例属性无关;如果想获取实例的属性字典,应该用vars(self),改成vars(self)[f'table{1}']=10也能实现需求,效果和操作__dict__类似。globals()返回的是全局命名空间,和实例属性完全不相关。
内容的提问来源于stack exchange,提问作者Zouzou
相关产品推荐
相关产品推荐

