遍历foo.py模块的内置属性。出错了

时间:2019-06-29 10:34:59

标签: python methods built-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'

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您的for语句中的方法不同于foo的方法。想象有一个清单;当您使用变量x对其进行迭代时,显然您无法执行list.x。某种程度上,您正是在这样做。从字符串获取属性的一种方法是getattr函数。在您的情况下,它将像这样使用:

import foo

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

Here是有关此功能的有用链接。

答案 2 :(得分:0)

for循环中,methodname,它在每次迭代中都指向不同的对象。

当您执行foo.method时,您尝试获取模块名称为foo的模块method的属性,而不是您所使用的名称method在循环中使用。如果您使用其他属性,例如foo.bar,您会更清楚。

现在,假设您想获取循环变量method所引用的属性,如果需要的话,则需要getattr从字符串属性名称中获取属性值。

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

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