检查 python 类属性

2024-02-04

我需要一种方法来检查类,以便我可以安全地识别哪些属性是用户定义的类属性。问题是 dir()、inspect.getmembers() 等函数返回所有类属性,包括预定义的属性,例如:__class__, __doc__, __dict__, __hash__。这当然是可以理解的,有人可能会说我可以只列出一个要忽略的命名成员列表,但不幸的是,这些预定义的属性必然会随着Python版本的不同而改变,因此使我的项目很容易在Python项目中改变- 我不喜欢那样。

example:

>>> class A:
...   a=10
...   b=20
...   def __init__(self):
...     self.c=30
>>> dir(A)
['__doc__', '__init__', '__module__', 'a', 'b']
>>> get_user_attributes(A)
['a','b']

在上面的示例中,我想要一种安全的方法来仅检索用户定义的类属性 ['a','b'] 而不是 'c',因为它是实例属性。所以我的问题是......任何人都可以帮助我完成上述虚构功能get_user_attributes(cls)?

我花了一些时间尝试通过解析 AST 级别的类来解决问题,这非常容易。但我找不到一种方法将已解析的对象转换为 AST 节点树。我想一旦一个类被编译成字节码,所有 AST 信息都会被丢弃。


下面是困难的方法。这是简单的方法。不知道为什么我没有早点想到。

import inspect

def get_user_attributes(cls):
    boring = dir(type('dummy', (object,), {}))
    return [item
            for item in inspect.getmembers(cls)
            if item[0] not in boring]

这是一个开始

def get_user_attributes(cls):
    boring = dir(type('dummy', (object,), {}))
    attrs = {}
    bases = reversed(inspect.getmro(cls))   
    for base in bases:
        if hasattr(base, '__dict__'):
            attrs.update(base.__dict__)
        elif hasattr(base, '__slots__'):
            if hasattr(base, base.__slots__[0]): 
                # We're dealing with a non-string sequence or one char string
                for item in base.__slots__:
                    attrs[item] = getattr(base, item)
            else: 
                # We're dealing with a single identifier as a string
                attrs[base.__slots__] = getattr(base, base.__slots__)
    for key in boring:
        del attrs['key']  # we can be sure it will be present so no need to guard this
    return attrs

这应该是相当稳健的。本质上,它的工作原理是获取默认子类上的属性object忽略。然后它获取传递给它的类的 mro 并以相反的顺序遍历它,以便子类键可以覆盖超类键。它返回键值对的字典。如果您想要一个键值元组列表,例如inspect.getmembers然后返回attrs.items() or list(attrs.items())在Python 3中。

如果您实际上不想遍历 mro 而只想直接在子类上定义属性,那么它更容易:

def get_user_attributes(cls):
    boring = dir(type('dummy', (object,), {}))
    if hasattr(cls, '__dict__'):
        attrs = cls.__dict__.copy()
    elif hasattr(cls, '__slots__'):
        if hasattr(base, base.__slots__[0]): 
            # We're dealing with a non-string sequence or one char string
            for item in base.__slots__:
                attrs[item] = getattr(base, item)
            else: 
                # We're dealing with a single identifier as a string
                attrs[base.__slots__] = getattr(base, base.__slots__)
    for key in boring:
        del attrs['key']  # we can be sure it will be present so no need to guard this
    return attrs
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查 python 类属性 的相关文章

随机推荐

  • 在启动过程中程序正常退出。 gdb 不会在断点处中断

    我在尝试使用 gdb 调试任何程序的任何代码上都会收到此 gdb 错误 这是重现错误的最简单过程 创建一个main cpp包含以下内容的文件 int main return 0 Run g g main cpp Run gdb a out
  • 如何在创建表中创建非聚集索引?

    Create table FavoriteDish FavID int identity 1 1 primary key not null DishID int references Dishes DishID not null Celeb
  • 有没有办法让跟踪显示 Kogito 中为 DMN 执行的决策顺序?

    我终于运行了我的 dmn quarkus 示例示例 是否有一个属性可以启用跟踪 以便打印执行的决策序列 我注意到 当我为 DMN 模型提供不正确的 JSON 时 Kogito 会做出详细响应 告诉我哪个决策失败了 这太棒了 是否有一个属性可
  • 实体框架代码优先 - 非主键字段的外键

    我有两张表 如下所示 dbo ReviewType ReviewTypeId INT PRIMARY KEY ShortName CHAR 1 Unique Index Description dbo Review ReviewId INT
  • 等待 Casper.js 中的 URL 更改?

    有一个waitForUrl 功能在Casper js 但是有可能吗waitForUrlChange in Casper js 我的意思是检测到变化this getCurrentUrl 价值 我无法预测新的 url 值 它可以是任何东西 有一
  • 多个进程上的 fs.createWriteStream

    如何实现多个 Node js 进程写入同一个文件的系统fs createWriteStream 这样它们就不会覆盖数据 看起来 fs createWriteStream 的默认设置是在调用该方法时清除文件 我的目标是清除一次文件 然后让所有
  • MongoDB:聚合并展平数组字段

    在使用关系数据库 SQL Server MySQL Oracle Informix 28 年之后 我已转向 MongoDB 过去两周进展缓慢 我想提出几个问题来证实我的想法 我的文档如下所示 忽略此问题的分组 id xyz 800 site
  • emberjs 1.0.0pre4 如何将上下文对象传递给资源“...Index”路由?

    在一个简单的 ember 应用程序中 我有一个带有索引模板的资源 详细信息 在应用程序索引模板中 我有一个调用的按钮transitionTo detail obj 在索引控制器上 其中obj是被单击的内容项 这通过obj as the mo
  • ruby 中的反引号和单引号错误消息 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 为什么 ruby 在错误消息中使用反引号和单引号 bad method NameError undefined local variable o
  • Android获取外部存储绝对路径

    我想下载一些文件并将它们保存到手机 平板电脑的内部存储中 已在 Samsung Galaxy Note 2 和 Galaxt Tab 10 1 上试用 当我使用 storage sdcard0 在他们身上 代码运行成功 但是当我使用Gala
  • Require.js 忽略 baseUrl

    好吧 这让我发疯 所以也许有人可以指出我正确的方向 我使用最新的 require js 和 jquery 作为我的模块加载器 我正在使用data main属性指向一个配置文件baseUrl 当我尝试加载模块时baseUrl被忽略 并且 re
  • Flash:距 MovieClip 最近的点

    我需要限制一个点内DisplayObject艺术家给我的 我让它工作 但仅适用于光标仍在内部的情况bounds 有限对象称为limited function onSqMouseMove event MouseEvent if bounds
  • 在画布中移动按钮

    当鼠标悬停在 UIElement 上并且用户按下 Ctrl 键时 以下代码应该在画布中移动 UIElement void keydown Object sender KeyEventArgs e if e Key Key LeftCtrl
  • 如何运行本地 Windows 应用程序并将输出通过管道传输到浏览器

    我有 Windows 应用程序 EXE 文件是用 C 编写并使用 MS Visual Studio 构建的 它将 ASCII 文本输出到标准输出 我希望增强 ASCII 文本以包含有限的 HTML 和一些链接 我想调用此应用程序 EXE 文
  • 将向量列表转换为计数数据帧[重复]

    这个问题在这里已经有答案了 我有一个存储在如下列表中的字符向量列表 basket1 lt c Apple Orange Banana Apple Apple Grape basket2 lt c Grape Grape Grape Grap
  • 如何获取适配器内的视图高度以创建大小的位图?

    我将自定义 CursorAdapter 与自定义项一起使用 我需要视图高度来调整资源文件夹中位图的大小 并将此调整大小的位图设置为列表项中的 ImegeView Override public void bindView View view
  • 在 Firefox 中检测缩放

    我想检测浏览器是否放大或缩小 并不真正关心知道该值 但我认为无论如何都需要在决策过程中找到它 我已经阅读了很多关于该主题的其他 SO 帖子 但是没有一个给出的解决方案适用于 FF 尽管有 IE7 8 和 chrome 解决方案 哦 我不能使
  • 如何强制在派生类中调用基类构造函数?

    我相当确定基本的 C 问题 如果我有一个带有不带参数的构造函数的基类 并且只初始化一些受保护的成员 如果派生类与参数匹配 它是否也会立即调用此基构造函数 一厢情愿但不太可能的想法 如果不是 则为有没有办法强制它从派生类自动调用所述基构造函数
  • 数据绑定:如果属性不为空,则设置属性

    无法理解 仅当变量字段不为空时如何设置视图的某些属性 例如
  • 检查 python 类属性

    我需要一种方法来检查类 以便我可以安全地识别哪些属性是用户定义的类属性 问题是 dir inspect getmembers 等函数返回所有类属性 包括预定义的属性 例如 class doc dict hash 这当然是可以理解的 有人可能