我来自红宝石背景,我注意到python的一些差异......在ruby中,当我需要创建一个帮助器时,我通常会选择一个模块,如下所示:
module QueryHelper
def db_client
@db ||= DBClient.new
end
def query
db_client.select('whateverquery')
end
end
在python中,我做了类似以下的事情:
db_client = DBClient()
def query():
return db_client.select('whateverquery')
我唯一担心的是,每次调用query()函数时,它都会尝试反复实例化DBClient()......但是基于读取和测试,这似乎不会因为某些缓存而发生我导入模块时在python中的机制...
问题是如果上面的python是不好的做法,如果是这样,为什么以及如何改进?或许懒得评价一下?或者,如果你们相信这样就可以了......
答案 0 :(得分:2)
没有。每次调用query
函数时都不会重新实例化。这是因为您已经在DBClient
函数的1>}外创建了query
的实例。这意味着您当前的代码没有问题。
如果您打算在每次调用DBClient
时创建query
的新实例,那么您应该将声明移到query
函数中,如下所示:
def query():
db_client = DBClient()
return db_client.select( ... )
答案 1 :(得分:-1)
总之,您想为DBClient对象添加一个方法吗?为什么不动态添加呢?
# defining the method to add
def query(self, command):
return self.select(command)
# Actually adding it to the DBClient class
DBClient.query = query
# Instances now come with the newly added method
db_client = DBClient()
# Using the method
return_command_1 = db_client.query("my_command_1")
return_command_2 = db_client.query("my_command_2")
致Igor Sobreira的信用。