迭代 foo.py 模块的内置属性。出错了

Iterating over built-in atributes of foo.py module. Got an error

我正在循环:"for atribute in dir(foo):"

但是我不能使用 'atribute' 变量,因为它是 foo 的内置属性。这是为什么?

print(__name__)         # <class 'str'>

for atribute in dir(foo):
   print(atribute)        # is <class 'str'> too

...那么为什么我会收到如下错误消息?

import foo

for atribute in dir(foo):
    print(foo.atribute)

#AttributeError: module 'foo' has no attribute 'atribute'

for声明的方法与foo的方法不同。想象一下有一个列表;当你用变量 x 遍历它时,你显然不能做 list.x。以某种方式,你正在这样做。从字符串中获取属性的一种方法是 getattr 函数。在你的情况下,它会像这样使用:

import foo

for method in dir(foo):
    print(getattr(foo, method))

Here 关于这个函数很有用 link。

当您尝试打印 foo.method 时,您正在尝试查找 foo 对象的 method 属性。该名称与本地名称空间中已有的 method 变量无关。要查找名称在 method 变量中的属性,请使用 getattr:

for method in dir(foo):
    print(getattr(foo, method))

for循环中,method是一个name,它在每次迭代中引用不同的对象。

当您执行 foo.method 时,您正在尝试获取模块 foo 的属性,其字面名称为 method,这不是您创建的名称 method在循环中使用。如果您使用不同的属性,例如foo.bar,这样你就更清楚了

现在,您可能想要获取循环变量 method 所指的属性,如果是这样,您需要 getattr 从字符串属性名称中获取属性值。

dir returns 属性作为 字符串列表 ,因此在每次迭代中,您将获得名称引用的属性字符串对象的值method:

for method in dir(foo):
    print(getattr(foo, method))