2016-05-02 11 views
0

私は、pyscopg2を使ってPostgresデータベース接続を管理するPythonクラスを作成しています。Pythonの初期化プロパティ

私はクラスを初期化時にデータベースに接続したいと思っています(かもしれません。はひどいアイデアかもしれませんが、私は理由がないと思います)。私は前に使ったことのないプロパティでこの作業をしようとしています。つまり、__init__メソッドの中からgetterを呼び出す必要があります。

私のクラスでは、このようなものになります。このバージョンでは

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

'もしhasattr(self、" _ connection ")'ならば、それはもっと悪いと思うでしょう。 –

+0

しかし、私は本当にKindallに同意しなければなりません、本当にプロパティにアクセスするたびに新しい接続を作成する必要がありますか? –

答えて

1

、あなたが使用できます。

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