Начало > В глубь языка Python > Сила самоанализа > Получение атрибутов с помощью getattr | << >> | ||||
В глубь языка Python Для программистов |
Вы уже знаете, что функции в языке Python являются объектами. Но вы пока не знаете, что если имя функции становится известно только во время выполнения программы, то ее можно получить с помощью функции getattr.
>>> li = ["Larry", "Curly"]
>>> li.pop
<built-in method pop of list object at 010DF884>
>>> getattr(li, "pop")
<built-in method pop of list object at 010DF884>
>>> getattr(li, "append")("Moe")
>>> li
["Larry", "Curly", "Moe"]
>>> getattr({}, "clear")
<built-in method clear of dictionary object at 00F113D4>
>>> getattr((), "pop")
Traceback (innermost last):
File "<interactive input>", line 1, in ?
AttributeError: 'tuple' object has no attribute 'pop'
Таким образом вы получаете метод pop списка. Обратите внимание, что вы не вызываете его (для этого нужно выполнить li.pop()), а получаете в виде объекта. | |
Здесь мы также получаем метод pop, но теперь имя метода указано в виде строкового аргумента функции getattr. getattr — очень полезная функция, позволяющая получить любой атрибут любого объекта. В данном случае объектом является список, а его атрибутом — метод pop. | |
В случае, если вы еще не до конца осознали, насколько это может быть полезным, попробуйте выполнить этот код: значение, возвращаемое функцией getattr является методом, который можно вызвать, как если бы вы просто вызвали li.append("Moe"). Но вы не вызываете метод напрямую — вы указываете имя метода в виде строки. | |
getattr работает и для словарей. | |
Теоретически, getattr работает и для кортежей, но кортежи не имеют методов, так что getattr сгенерирует исключение независимо от имени атрибута, которое вы дадите. |
getattr предназначен не только для встроенных типов данных. Он также работает и для модулей.
Пример 2.12. getattr в apihelper.py
>>> import odbchelper
>>> odbchelper.buildConnectionString
<function buildConnectionString at 00D18DD4>
>>> getattr(odbchelper, "buildConnectionString")
<function buildConnectionString at 00D18DD4>
>>> object = odbchelper
>>> method = "buildConnectionString"
>>> getattr(object, method)
<function buildConnectionString at 00D18DD4>
>>> type(getattr(object, method))
<type 'function'>
>>> import types
>>> type(getattr(object, method)) == types.FunctionType
1
>>> callable(getattr(object, method))
1
Так мы можем получить функцию buildConnectionString из модуля odbchelper, который сы изучали в разделе Знакомство с языком Python. (Шестнадцатиричный адрес характерен для моей машины, у вас он будет другим.) | |
Используя getattr, мы можем получить ту же самую функцию. В общем, getattr(object, "attribute") дает такой же результат, как object.attribute. Если object является модулем, attribute может быть любым объектом, определенном в этом модуле: функцией, классом или другой глобальной переменной. | |
На самом деле именно это и делает функция help. object передается функции в качестве аргумента; method является строкой с именем метода или функции. | |
В данном случае, method содержит имя функции, в чем мы можем убедиться получив ее тип. | |
Так как method является функцией, ее можно вызвать. |
type, str, dir и другие встроенные функции | 1 2 3 4 5 6 7 8 9 | Фильтрование списков |
Copyright © 2000, 2001, 2002 Марк Пилгрим Copyright © 2001, 2002 Перевод, Денис Откидач |