python: наличие атрибута у класса

Модератор: Модераторы разделов

Ответить
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

python: наличие атрибута у класса

Сообщение nadge »

Трудно объяснить, но вобщем есть некий класс, у класса есть объект:
object = Class()

Как узнать, есть ли переменная object.variable ? Она не задается ни в определении класса, ни в __init__, а порождается во время работы.

Сейчас делаю через try ..... except AttributeError с соответствующими обработчиками. Но это громоздко.

Есть ли более короткий способ?
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: python: наличие атрибута у класса

Сообщение nadge »

Эх, блин, туплю. Делается через hasattr().


З.Ы. Но конструкцию из первого поста я выдрал из (кажется) класса SocketServer, входящего в состав питона. Может есть какой-то смысл в том, что там она используется?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: python: наличие атрибута у класса

Сообщение NickLion »

Не знаю как насчёт более короткого, но вот более корректный это факт: http://docs.python.org/library/functions.html#hasattr

PS хотя описание реализации - точно так как Вы делаете :)

PPS по-моему это наколенное решение. Вообще это порочная практика делать has через get и отлов исключения:
0. Ведь уже есть структуры, в которых хранится информация об атрибутах.
1. Производится вызов свойства - лишние затраты по времени, памяти.
2. А если само свойство выбрасывает AttributeError? Ну так, ради прикола.
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: python: наличие атрибута у класса

Сообщение nadge »

NickLion
Прочитав начало Вашего поста, начал было писать ответ, но дальше Вы сказали именно то, о чем я подумал...

порочная практика делать has через get и отлов исключения

Даже иначе можно сформулировать: ведь get и так сперва ппроверяет наличие атрибута. Т.е. логичнее было бы наоборот делать get через has.

Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Контактная информация:

Re: python: наличие атрибута у класса

Сообщение Portnov »

В питоне "быстрые исключения". Содержимое ветки try... выполняется практически также быстро, как если бы try не было, накладные расходы появляются только если исключение таки случается. И свойства классов/объектов хранятся в интерпретаторе в структуре, аналогичной питоновскому словарю, поэтому доступ к полю объекта по ресурсам не отличается от доступа к элементу словаря.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: python: наличие атрибута у класса

Сообщение NickLion »

Portnov писал(а):
19.07.2010 08:33
В питоне "быстрые исключения". Содержимое ветки try... выполняется практически также быстро, как если бы try не было, накладные расходы появляются только если исключение таки случается. И свойства классов/объектов хранятся в интерпретаторе в структуре, аналогичной питоновскому словарю, поэтому доступ к полю объекта по ресурсам не отличается от доступа к элементу словаря.

Я не спорю, что там быстрые исключения. Время тратится на сам вызов свойства. Вот даже к чему приводило: http://mail.python.org/pipermail/python-de...ber/058498.html
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: python: наличие атрибута у класса

Сообщение watashiwa_daredeska »

nadge писал(а):
19.07.2010 08:29
ведь get и так сперва ппроверяет наличие атрибута.
Не обязательно.

Код: Выделить всё

class LifeUniverseAndEverything(object):
  def __getattr__(self, name):
    if name == 'answer':
      return 42

Спасибо сказали:
Ответить