Получение атрибутов с помощью 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 Перевод, |