python - 在运行时一般访问任意对象的属性

标签 python

<分区>

假设我们有一个未知类型的任意对象,我们想要访问与该对象关联的同样任意的属性,以字符串名称的形式进行查询。我正在寻找获得此值的最佳实践方法。

在伪代码/Python 中,我正在考虑的当前策略是这样的:

def access_attribute(obj, attr):
    if type(obj) == types.FunctionType:
        return access_attribute(obj(), attr)
    elif type(obj) == types.DictType:
        return obj.get(attr)
    # ... etc.

需要考虑的几个项目:

  • 如果对象上不存在该属性会怎样?我可以提出异常(exception)。
  • 该属性可能嵌套很深。

我认为这是编程语言和 DSL 解释器必须解决的问题,但我不知道标准/普遍接受的最佳实践。

在运行时将自定义存储的 DSL/代码与对象一起传递给 eval 的想法已经被提出,但我现在想避免这种特殊的解决方案,而更喜欢 Pythonic 的解决方案。

最佳答案

getattr(object, name[, default])似乎至少回答了你问题的前半部分和这一点:

What happens if the attribute does not exist on the object? I am okay raising an exception.

我认为这是最佳实践,因为它是标准库的一部分。

关于第二点:

The attribute may be deeply nested.

一个解决方案是使用 dir(object) (它将列出一个对象的所有属性)并循环遍历非字典对象的那些属性,但我对该解决方案的“最佳实践”方面不太有信心。

关于python - 在运行时一般访问任意对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41572043/

相关文章:

python - 在 Python 中创建类对象属性后如何更改它们?

python - 有条件阴影的Pythonic方法是什么?

python - 意外的 : flufl. 枚举打印整数值

python - 如何在 numpy 数组中的 XYZ 位置插入 csv 文件中的浮点值

python - 在 python 中合并两个字典 View

python - 如何使用 3 个冒号分隔符反向显示列表?

Python将源自一个模块的对象从另一个模块导入第三个模块

Python:将相同的整数值分组,然后求平均值

python 每月最后一个工作日(使用 CustomBusinessDay)?

python - C 相当于 Python crypto.crypto()