Я делаю цикл: "для атрибута в dir (foo):"

Однако я не могу использовать переменную «атрибут», как это было встроенные атрибуты 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
kubaSpolsky 29 Июн 2019 в 13:34

3 ответа

Лучший ответ

Метод из вашего утверждения for отличается от метода foo. Представь себе список; когда вы перебираете его с переменной x, вы явно не можете сделать list.x. Так или иначе, вы делаете именно это. Способ получить атрибут из строки - это функция getattr. В вашем случае это будет использоваться так:

import foo

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

Здесь - полезная ссылка об этой функции.

0
G3bE 29 Июн 2019 в 10:45

Когда вы пытаетесь напечатать foo.method, вы пытаетесь найти атрибут method объекта foo. Это имя не связано с переменной method, которая уже есть в вашем локальном пространстве имен. Чтобы найти атрибут, имя которого находится в переменной method, используйте getattr:

for method in dir(foo):
    print(getattr(foo, method))
1
Blckknght 29 Июн 2019 в 10:45

В цикле for method является name, который ссылается на разные объекты на каждой итерации.

Когда вы делаете foo.method, вы пытаетесь получить атрибут модуля foo с буквальным именем method, который не является именем method, которое вы используете в петля . Если вы используете другой атрибут, например foo.bar, это было бы более понятно для вас.

Теперь, по-видимому, вы хотите получить атрибут, на который ссылается переменная цикла method, если вам нужно, то getattr, который получает значения атрибута из имен строковых атрибутов.

dir возвращает атрибуты в виде списка строк , поэтому на каждой итерации вы получаете значение объекта строки атрибута, на которое ссылается имя method:

for method in dir(foo):
    print(getattr(foo, method))
0
heemayl 29 Июн 2019 в 10:50