2016-05-02 5 views
0

Я пишу класс Python для управления подключением базы данных Postgres с помощью pyscopg2.Инициализация свойств Python

Я хотел бы, чтобы класс установил соединение с базой данных при инициализации (я чувствую, что это может быть ужасной идеей, но я не могу придумать, почему). Я пытаюсь сделать эту работу с собственностью, которой я никогда раньше не пользовался. Другими словами, я хочу, чтобы геттер вызывался из метода __init__.

Мой класс выглядит примерно так:

class MyDatabase: 
    connection_string = "host='<host_ip>' db_name='<db_name>'" 

    def __init__(self): 
     # * 
     self._connection = connection 

    @property 
    def connection(self): 
     # Check for an existing connection 
     if self._connection: 
      self._connection.close() 
     self._connection = psycopg2.connect(connection_string) 
     return self._connection 

    ... 

В этой версии, проверка существующего соединения бросает AttributeError: Elefriends instance has no attribute '_connection', что имеет смысл. Я могу обойти это, просто добавив строку, которая говорит self._connection = None, в месте, где я отмечен # *, но это кажется неуклюжим. Это цена, которую я плачу за удобство? Я просто суетливый? Или есть лучший способ?

Спасибо!

+1

Вы действительно хотите свежее соединение * каждый раз * вы спрашиваете для подключения? Просто установите его как обычный атрибут в свой '__init__' и забудьте об этом. – kindall

+0

'if hasattr (self," _ connection ")', но я бы сказал, что было бы хуже. –

+0

, но я действительно должен согласиться с Kindall, вы действительно уверены, что он должен устанавливать новое соединение каждый раз при доступе к собственности? –

ответ

1

Вместо если ... заявление, вы можете использовать:

try: 
    self._connection.close() 
except AttributeError: 
    pass 
self._connection = psycopg2.connect(connection_string) 
return self._connection