2016-10-12 23 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(),当我需要一些数据库操作时,我会创建另一个对象(或重新创建一个对象),例如调用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