如何获取类中被@property装饰器修饰的所有方法列表?
获取类中被@property修饰的方法列表
要找出类里所有被@property装饰的方法,核心思路很简单:被@property装饰后的属性本质是property类型的对象,所以我们只需要遍历类的属性,筛选出类型为property的项就行。
针对你给出的C类,这里有两种实用的实现方式:
方法一:用dir()结合类型判断
class C(object): def __init__(self): self._x = None self._y = None @property def x(self): """I'm the 'x' property.""" return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x @property def y(self): return self._y def z(self): pass # 筛选出所有@property修饰的属性名 property_names = [name for name in dir(C) if isinstance(getattr(C, name), property)] print(property_names) # 输出: ['x', 'y']
简单解释下:
dir(C)会列出类C的所有公开属性和方法名getattr(C, name)获取对应名称的属性对象isinstance(..., property)判断这个对象是不是property类型——是的话就说明它是被@property装饰过的方法
方法二:用inspect模块更严谨处理
如果你想更规范地处理类成员的检查,也可以用Python内置的inspect模块:
import inspect property_names = [] # 遍历类的所有成员(键值对形式) for name, member in inspect.getmembers(C): if isinstance(member, property): property_names.append(name) print(property_names) # 输出: ['x', 'y']
这里inspect.getmembers(C)会返回类C的所有成员细节,直接筛选property类型的成员即可。
需要注意的是,像x.setter和x.deleter这类修饰器不会被重复统计,因为它们属于同一个property对象的扩展,最终只会识别出x这一个属性名,完全符合你要排除z、只保留x和y的需求。
内容的提问来源于stack exchange,提问作者wolfrevo
相关产品推荐
相关产品推荐

