我正在做一个循环:“用于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'
答案 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
循环中,method
是name
,它在每次迭代中都指向不同的对象。
当您执行foo.method
时,您尝试获取模块名称为foo
的模块method
的属性,而不是您所使用的名称method
在循环中使用。如果您使用其他属性,例如foo.bar
,您会更清楚。
现在,假设您想获取循环变量method
所引用的属性,如果需要的话,则需要getattr
从字符串属性名称中获取属性值。
dir
将属性作为字符串列表返回,因此在每次迭代中,您将获得名称为method
的属性字符串对象的值:
for method in dir(foo):
print(getattr(foo, method))