如何通过列表修改Python类的属性?
如何通过列表修改类属性?
你猜的没错——当你把myobject.attrib放入列表时,存入的只是它当前的值(整数0)的副本,和类属性本身没有关联。修改列表里的元素只是改变了列表中的那个独立值,自然不会影响myobject.attrib。
要通过列表修改类属性,得让列表里保存能关联到类属性的引用,而不是单纯的值。这里有几种可行的方法:
方法一:直接存入类对象
把类本身放进列表,之后通过列表中的类对象直接修改属性:
class myobject: attrib = 0 thelist = [object(), myobject] # 通过列表中的类对象修改属性 thelist[1].attrib = 1 print(myobject.attrib) # 输出 1
方法二:存入类名和属性名的组合
如果不方便存类对象,可以把类的名称(字符串)和属性名存入列表,之后通过命名空间获取类并修改属性:
class myobject: attrib = 0 thelist = [object(), ('myobject', 'attrib')] # 从全局命名空间获取类,修改属性 cls_name, attr_name = thelist[1] setattr(globals()[cls_name], attr_name, 1) print(myobject.attrib) # 输出 1
方法三:用包装类持有属性引用
自定义一个简单的包装类,用来保存类和属性的引用,通过包装类的接口来修改原始属性:
class Ref: def __init__(self, obj, attr_name): self.obj = obj self.attr_name = attr_name def set_value(self, new_val): setattr(self.obj, self.attr_name, new_val) class myobject: attrib = 0 thelist = [object(), Ref(myobject, 'attrib')] # 通过包装对象修改原始属性 thelist[1].set_value(1) print(myobject.attrib) # 输出 1
这些方法的核心都是让列表里保存能指向类属性的关联对象,而不是单纯的属性值,这样修改时就能直接作用到原始的类属性上。
内容的提问来源于stack exchange,提问作者user74542
相关产品推荐
相关产品推荐

