迭代 foo.py 模块的内置属性。我收到一个错误

问题描述 投票:0回答:3

我正在做一个循环:“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'
python methods built-in
3个回答
1
投票

当您尝试打印

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

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

0
投票

for
陈述的方法,与
foo
的方法不同。想象一下有一个清单;当您使用变量
x
对其进行迭代时,您显然无法做到
list.x
。以某种方式,你正在做这件事。从字符串获取属性的一种方法是使用
getattr
函数。在你的情况下,它会像这样使用:

import foo

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

这里是关于此功能的有用链接。


0
投票

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

当您执行

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

现在,大概您想要获取循环变量

method
引用的属性,如果是这样,您需要
getattr
从字符串属性名称获取属性值。

dir
字符串列表的形式返回属性,因此在每次迭代中,您都会获得由名称
method
引用的属性字符串对象的值:

for method in dir(foo):
    print(getattr(foo, method))
© www.soinside.com 2019 - 2024. All rights reserved.