gpt4 book ai didi

python - 如何在 python 中替换特定的数据库实现?

转载 作者:行者123 更新时间:2023-12-01 06:15:09 24 4
gpt4 key购买 nike

如果我有一个单独的类用于数据库调用,并且我创建了数据库层的另一个实现,但使用了不同的数据存储。

有没有办法让我完全交换实现而不必更改代码分配?

即我正在启动一个项目,因此我可以正确设计事物以从一开始就实现这一目标。

注意:我也会将此模式用于网站的其他部分,而不仅仅是数据库层,因此它并不真正特定于数据库层。

最佳答案

只要两个模块实现完全相同的接口(interface)(具有相同名称、方法和其他属性的类、具有相同名称和签名的函数……),您就可以在应用程序时选择其中之一启动时,例如根据某个配置文件,并以固定名称导入所选的配置文件。然后,应用程序的所有其余部分都可以使用该固定名称,并且除了启动代码之外,还可以幸福地不知道在开始时可能已完成的任何恶作剧。

例如,考虑一个简化的情况:

# english.py
def greet(): return 'Hello!'

# italian.py
def greet(): return 'Ciao!'

# french.py
def greet(): return 'Salut!'

# config.py
langname = 'italian'

# startit.py
import config
import sys
lang = __import__(config.langname)
sys.modules['lang'] = lang

现在,应用程序的所有其余部分都可以导入 lang,并且它将在该名称下获得 italian 模块,因此,当调用 lang 时.greet(),它将得到字符串'Ciao!'

当然,在现实生活中,您将拥有多个模块,每个模块都有多个函数、类等,但一般原则仍然非常相似。只需特别注意具有限定名称的模块(例如foo.bar),即必须驻留在包中的模块(在本例中为foo)。对于这些,你不能只使用 __import__ 的返回值,而必须使用稍微迂回的方法,例如:

import sys
def importanyasname(actualname, fakename):
__import__(actualname)
sys.modules[fakename] = sys.modules[actualname]

也就是说,忽略__import__的返回值,并向右查找sys.modules字典中剩下的值(以实际名称作为键) -- that 是您要查找的模块对象,您可以使用“假名称”将其重新设置到 sys.modules 中,应用程序的所有其余部分都将通过该名称进行更改。能够随时轻松地导入它。

关于python - 如何在 python 中替换特定的数据库实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3654873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com