检查 class 上所有属性 ('@属性') 的值

Check the value of all properties ('@property') on a class

使用 Python 3.8,我希望识别用 @property 装饰的方法,然后检查这些属性的值以确保它们都具有字符串值,而不是 None .

我的理由是未来将添加更多 @property 方法,我宁愿不必更新验证函数来获取和测试每个方法的值,所以我正在寻找一种使该过程自动化的方法。

我已经能够使用 的答案识别所有属性。

props = inspect.getmembers(type(self), lambda o: isinstance(o, property))

但是,我不确定如何处理已返回的元组列表。

[('certificate', <property object at 0x7f7aaecec400>), ('protocol', <property object at 0x7f7aac7d2f90>), ('url', <property object at 0x7f7aac7da040>)]

使用 props 中的元组列表,有没有办法调用属性并检查值?


我的解决方案

感谢接受的答案,这是我的解决方案。

class MyClass:

    # Methods removed for brevity.

    def _validate(self) -> None:
        props = inspect.getmembers(type(self), lambda o: isinstance(o, property))
        invalid_props = [p for p, _ in props if getattr(self, p) is None]
        if invalid_props:
            raise MyException(invalid_props)

您可以将 getattrprops 元组中的 属性 名称一起使用。

valid = [p for p, _ in props if getattr(self, p) is not None]

请记住,访问 属性 可能会执行任意代码,因此获取值本身可能会将值设置为 None 或不设置为 None.