2016-10-12 10 views
0

これは私のデータベース・マネージャー・クラスである:Pythonでメソッドの匿名呼び出しがありますか?

class DatabaseManager(object): 
    def __init__(self): 
     super().__init__() 
     self.conn = sqlite3.connect('artist.db') 
     self.c = self.conn.cursor() 

    def create_table(self): 
     self.c.execute(
      'CREATE TABLE IF NOT EXISTS artists(title TEXT, artist TEXT, album TEXT, year INTEGER, ' 
      'genre TEXT, ext TEXT, path TEXT, art TEXT)') 
     self.c.close() 
     self.conn.close() 

    def insert(self, song): 
     self.c.execute(
      'INSERT INTO artists(title, artist, album, year, genre, ext, path, art) VALUES(?, ?, ?, ?, ?, ?, ?, ?)', 
      (song.title, song.artist, song.album, song.year, song.genre, song.ext, song.path, song.art)) 
     self.conn.commit() 
     self.c.close() 
     self.conn.close() 

    def retrieve_all(self): 
     self.c.execute('SELECT * FROM artists') 
     data = self.c.fetchall() 
     self.c.close() 
     self.conn.close() 
     return data 

は、より多くの方法がありますが、これは重要ではありません。私がcreate_table()を呼び出すと、私はいくつかのデータベースアクションが必要なときに私は別のobect(または過去のものを作り直して)insertを呼び出して呼び出します。

db = DatabaseManager() 
    print(db.retrieve_artist('asdf')) 
    db = DatabaseManager() 
    print(db.retrieve_all()) 

これを避ける方法はありますか? Javaでは匿名の呼び出しがあります: new DatabaseManager().retrieve_artist("asdf") Pythonでは何も同様のことが可能ですか?

+0

Pythonの 'lamda'関数を確認してください –

+3

あなたはJavaでPythonとは何をしていますか?もちろん、変数 '' DatabaseManager()。retrieve_artist( 'asdf') 'をスキップすることもできます。 – RemcoGerlich

+0

これは非常に奇妙なAPIですが、オブジェクトを作成すると接続が開き、メソッドを呼び出すと閉じられ、オブジェクトを使用できなくなります。どうして? – RemcoGerlich

答えて

1

@Remcogerlich氏によると、インスタンス化を変数に代入しています。あなたがそうしないと、あなたが望むものに近づくことができます。このようにして

DatabaseManager().retrieve_artist('asdf') 

AnyOtherClass().callAnyMethod() 

# both disappeared 

、Pythonは、インスタンス化を実行し、あなたがしたいメソッドを呼び出して、あなたが任意の変数に割り当てることを教えていないので、それは「を消えます」。

あなたも、このようなクラスの機能とそれを行うことがあります。

ClassWithClassMethods.callAnyClassMethod() 

しかし、私はそのようにそれで動作するようにあなたをお勧めしません。通常、データベース接続はインスタンス化として確立され、必要に応じて使用され、不要になったときにはを安全にに閉じます。私はあなたがそこでそれをやっていないと思うし、メモリ使用量を浪費していると思います。長い間データベースを使用するたびにオブジェクトを作成し、そのコードで作業を終えると、接続を閉じてオブジェクトを削除する方が簡単です。

+0

オブジェクトを保持しないとメモリが無駄になるのはなぜですか? – nephilimrising

+0

毎回新しい接続を作成して閉じる必要があるため、データベースアクションを作成するたびにインスタンスを作成してメモリを浪費しています。 @nephilimrising –

+0

@RemcoGerlichがオープンとクローズのためのメソッドを作成し、終了時にアプリケーションの開始と終了を呼び出すように提案していると思いますか? – nephilimrising

関連する問題