В глубь языка Python


Получение атрибутов с помощью getattr


Вы уже знаете, что . Но вы пока не знаете, что если имя функции становится известно только во время выполнения программы, то ее можно получить с помощью функции getattr.

Пример 2.11. Функция 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, который сы изучали в разделе . (Шестнадцатиричный адрес характерен для моей машины, у вас он будет другим.)
Используя getattr, мы можем получить ту же самую функцию. В общем, getattr(object, "attribute") дает такой же результат, как object.attribute. Если object является модулем, attribute может быть любым объектом, определенном в этом модуле: функцией, классом или другой глобальной переменной.
На самом деле именно это и делает функция help. object передается функции в качестве аргумента; method является строкой с именем метода или функции.
В данном случае, method содержит имя функции, в чем мы можем убедиться получив ее .
Так как method является функцией, ее можно .
  4  
Copyright © 2000, 2001, 2002

Copyright © 2001, 2002, 2003 Перевод,

Содержание раздела