Python类动态添加方法报错:类无法下标赋值的问题咨询
动态给类批量添加属性的正确实现
你之前的代码报错是因为类对象不支持用[]下标赋值,要给类动态添加属性或方法,得用Python内置的setattr()函数。另外还要注意一个坑:直接用lambda引用外部变量的话,所有动态生成的方法都会共用最后一次调用的变量值,得通过默认参数把当前的属性名绑定进去。
修正后的基础版本
def add_get_for(class_type, property_name): # 用默认参数prop绑定当前的property_name,避免闭包陷阱 setattr(class_type, property_name, lambda self, prop=property_name: self._attributes[prop]) class A: def __init__(self, input_object): self._attributes = process(input_object) add_get_for(A, 'attrib1') add_get_for(A, 'attrib2')
批量添加的优化写法
如果要添加一堆属性,不用反复调用函数,直接写个批量处理的版本:
def add_getters(class_type, *properties): for prop in properties: setattr(class_type, prop, lambda self, p=prop: self._attributes[p]) # 一次性添加多个属性 add_getters(A, 'attrib1', 'attrib2', 'attrib3')
更贴近原生属性的实现
要是想让这些动态属性和类的原生属性用法完全一样(不用加括号调用),可以动态生成property对象,访问时直接用实例.属性名即可:
def add_get_for(class_type, property_name): def getter(self): return self._attributes[property_name] # 把生成的property对象绑定到类上 setattr(class_type, property_name, property(getter)) # 使用方式不变 add_get_for(A, 'attrib1')
内容的提问来源于stack exchange,提问作者gph
相关产品推荐
相关产品推荐

