如何检测类属性是否含setter?列出类中带setter的property属性
找出类中带有Setter的Property属性
要搞定这个需求其实很直观——property对象本身自带一个fset属性,专门用来存储对应的setter方法。如果这个属性的值不是None,就说明该property定义了可写的setter。
下面直接上针对你给出的MyClass的解决方案:
基础实现(仅处理当前类的属性)
class MyClass(object): def __init__(self): self.a = 1 self._b = 2 self._c = 3 @property def b(self): return self._b @property def c(self): return self._c @c.setter def c(self, value): self._c = value def get_properties_with_setter(cls): props_with_setter = [] # 遍历类的所有类级属性 for attr_name, attr_value in cls.__dict__.items(): # 筛选出property类型的对象 if isinstance(attr_value, property): # 检查是否存在setter方法(fset不为None) if attr_value.fset is not None: props_with_setter.append(attr_name) return props_with_setter # 测试运行 print(get_properties_with_setter(MyClass)) # 输出: ['c']
进阶实现(支持继承场景)
如果你的类继承了父类的property,上面的方法可能会漏掉父类中定义的带setter的属性。这时候可以用dir()遍历所有可访问的属性,再结合getattr获取属性值:
def get_properties_with_setter(cls): props_with_setter = [] for attr_name in dir(cls): attr_value = getattr(cls, attr_name) if isinstance(attr_value, property): if attr_value.fset is not None: props_with_setter.append(attr_name) return props_with_setter
关键说明
property.fset:这是property对象的内置属性,保存了该property的setter方法引用。如果没有定义setter,它的值就是None。- 为什么要操作类属性而不是实例属性?因为property是类级别的装饰器,它绑定在类上,而不是实例的
__dict__里——实例的__dict__只会存储普通的实例变量(比如你的例子里的a、_b、_c)。
这样运行后,就能精准筛选出像c这种带有setter的property属性啦。
内容的提问来源于stack exchange,提问作者Yassine Faris
相关产品推荐
相关产品推荐

