实例化模块中的类

时间:2015-11-04 15:02:10

标签: python

我来自红宝石背景,我注意到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是不好的做法,如果是这样,为什么以及如何改进?或许懒得评价一下?或者,如果你们相信这样就可以了......

2 个答案:

答案 0 :(得分:2)

没有。每次调用query函数时都不会重新实例化。这是因为您已经在DBClient函数的}外创建了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的信用。