Что нужно знать при использовании оператора with для собственных классов?

Я планирую реализовать C ++ - подобные функции конструктора / деструктора для одного из моих классов Python, используя удобный с ] утверждение. До сих пор я встречал это утверждение только для файлового ввода-вывода, но я подумал, что это будет весьма полезно и для задач связи на основе соединений, скажем, сокетов или соединений с базой данных . Вещи, которые со временем нужно закрыть.

В PEP 343 (ссылка приведена выше) сказано, что с нужны методы __ enter __ и __ exit __ , и моя прямолинейная реализация этого появляется работать по назначению.

class MyConnection:
  def __init__(self):
    pass
  def __enter__(self):
    print "constructor"
    # TODO: open connections and stuff
    # make the connection available in the with-block
    return self 
  def __exit__(self, *args):
    print "destructor"
    # TODO: close connections and stuff

with MyConnection() as c:
  # TODO: do something with c
  pass

Что дает результат (как и ожидалось):

constructor
destructor

Должно ли это быть так просто? Что нужно учитывать помимо этого? Почему так много библиотек (по всей видимости) еще не имеют этой функциональности? Я что-то пропустил?

8
задан moooeeeep 18 January 2012 в 21:35
поделиться