Трудно объяснить, но вобщем есть некий класс, у класса есть объект:
object = Class()
Как узнать, есть ли переменная object.variable ? Она не задается ни в определении класса, ни в __init__, а порождается во время работы.
Сейчас делаю через try ..... except AttributeError с соответствующими обработчиками. Но это громоздко.
Есть ли более короткий способ?
python: наличие атрибута у класса
Модератор: Модераторы разделов
Re: python: наличие атрибута у класса
Эх, блин, туплю. Делается через hasattr().
З.Ы. Но конструкцию из первого поста я выдрал из (кажется) класса SocketServer, входящего в состав питона. Может есть какой-то смысл в том, что там она используется?
З.Ы. Но конструкцию из первого поста я выдрал из (кажется) класса SocketServer, входящего в состав питона. Может есть какой-то смысл в том, что там она используется?
Re: python: наличие атрибута у класса
Не знаю как насчёт более короткого, но вот более корректный это факт: http://docs.python.org/library/functions.html#hasattr
PS хотя описание реализации - точно так как Вы делаете
PPS по-моему это наколенное решение. Вообще это порочная практика делать has через get и отлов исключения:
0. Ведь уже есть структуры, в которых хранится информация об атрибутах.
1. Производится вызов свойства - лишние затраты по времени, памяти.
2. А если само свойство выбрасывает AttributeError? Ну так, ради прикола.
PS хотя описание реализации - точно так как Вы делаете
PPS по-моему это наколенное решение. Вообще это порочная практика делать has через get и отлов исключения:
0. Ведь уже есть структуры, в которых хранится информация об атрибутах.
1. Производится вызов свойства - лишние затраты по времени, памяти.
2. А если само свойство выбрасывает AttributeError? Ну так, ради прикола.
Re: python: наличие атрибута у класса
NickLion
Прочитав начало Вашего поста, начал было писать ответ, но дальше Вы сказали именно то, о чем я подумал...
Даже иначе можно сформулировать: ведь get и так сперва ппроверяет наличие атрибута. Т.е. логичнее было бы наоборот делать get через has.
Прочитав начало Вашего поста, начал было писать ответ, но дальше Вы сказали именно то, о чем я подумал...
порочная практика делать has через get и отлов исключения
Даже иначе можно сформулировать: ведь get и так сперва ппроверяет наличие атрибута. Т.е. логичнее было бы наоборот делать get через has.
- Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
- Контактная информация:
Re: python: наличие атрибута у класса
В питоне "быстрые исключения". Содержимое ветки try... выполняется практически также быстро, как если бы try не было, накладные расходы появляются только если исключение таки случается. И свойства классов/объектов хранятся в интерпретаторе в структуре, аналогичной питоновскому словарю, поэтому доступ к полю объекта по ресурсам не отличается от доступа к элементу словаря.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Re: python: наличие атрибута у класса
Portnov писал(а): ↑19.07.2010 08:33В питоне "быстрые исключения". Содержимое ветки try... выполняется практически также быстро, как если бы try не было, накладные расходы появляются только если исключение таки случается. И свойства классов/объектов хранятся в интерпретаторе в структуре, аналогичной питоновскому словарю, поэтому доступ к полю объекта по ресурсам не отличается от доступа к элементу словаря.
Я не спорю, что там быстрые исключения. Время тратится на сам вызов свойства. Вот даже к чему приводило: http://mail.python.org/pipermail/python-de...ber/058498.html
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: python: наличие атрибута у класса
Не обязательно.
Код: Выделить всё
class LifeUniverseAndEverything(object):
def __getattr__(self, name):
if name == 'answer':
return 42
Мои розовые очки