当前位置:  开发笔记 > 编程语言 > 正文

python inspect get方法用@property修饰

如何解决《pythoninspectget方法用@property修饰》经验,为你挑选了1个好方法。

这是我实际问题的简化示例.

我有一个这样foo定义的类foo.py:

class foo(object):
    def __init__(self):
        pass

    def bar(self):
        return True

    @property
    def baz(self):
        return False

现在,我想使用该inspect模块来获取foo类的方法(包括baz).这是我到目前为止所做的getmethods.py:

import foo
import inspect

classes = inspect.getmembers(foo, inspect.isclass)
for cls in classes:
    methods = inspect.getmembers(cls[1], inspect.ismethod)
    print methods

当我运行此脚本时,我得到以下输出(这并非完全出乎意料):

[('__init__', ), ('bar', )]

所以,我的问题是,为什么baz不被认为是一种方法,我如何修改getmethods.py以获得以下输出:

[('__init__', ), ('bar', ), ('baz', )]

Martijn Piet.. 12

所述@property装饰产生property对象,而不是函数或方法.正是这种对象调用它已存储在功能.fget,.fset.fdel(通过访问时在该对象上的属性描述符协议).

您必须显式测试该对象类型:

methods = inspect.getmembers(cls[1], inspect.ismethod)
properties = inspect.getmembers(cls[1], lambda o: isinstance(o, property))

要么

methods_and_properties = inspect.getmembers(
    cls[1], lambda o: isinstance(o, (property, types.MethodType)))

请注意,相同的限制适用于classmethodstaticmethod对象.



1> Martijn Piet..:

所述@property装饰产生property对象,而不是函数或方法.正是这种对象调用它已存储在功能.fget,.fset.fdel(通过访问时在该对象上的属性描述符协议).

您必须显式测试该对象类型:

methods = inspect.getmembers(cls[1], inspect.ismethod)
properties = inspect.getmembers(cls[1], lambda o: isinstance(o, property))

要么

methods_and_properties = inspect.getmembers(
    cls[1], lambda o: isinstance(o, (property, types.MethodType)))

请注意,相同的限制适用于classmethodstaticmethod对象.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有