Python 在不更改逻辑文件的情况下加载不同的模块

Python 在不更改逻辑文件的情况下加载不同的模块,python,interface,dynamic-import,Python,Interface,Dynamic Import,假设我有两个不同的模块,它们有统一(相同)的接口。文件列表如下所示: root/ logic.py sns_api/ __init__.py facebook/ pyfacebook.py __init__.py myspace/ pymyspace.py __init__.py pyfacebook.py和pymyspace.py具有相同的接口,这意味着: # in

假设我有两个不同的模块,它们有统一(相同)的接口。文件列表如下所示:

root/
   logic.py
   sns_api/
      __init__.py
      facebook/
          pyfacebook.py
          __init__.py
      myspace/
          pymyspace.py
          __init__.py
pyfacebook.py和pymyspace.py具有相同的接口,这意味着:

# in pyfacebook.py
class Facebook:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

# in pymyspace.py
class Myspace:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic
# in logic.py

PLATFORM = "facebook"

# import the right modules in, complete the logic with the current platform
# create the right instance and invoke the right methods
现在我有一个问题。我希望在logic.py中执行逻辑,而不复制代码,因此我想知道如何设置一个标志来显示我使用的模块和python将自动加载正确的代码,这意味着:

# in pyfacebook.py
class Facebook:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

# in pymyspace.py
class Myspace:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic
# in logic.py

PLATFORM = "facebook"

# import the right modules in, complete the logic with the current platform
# create the right instance and invoke the right methods
然后我改变PLATFORM='myspace',逻辑将自动工作

那我该怎么做呢

我想知道使用动态导入是否可行,或者评估原始python代码,但似乎不是一个好的解决方案。或者如果我能在里面做一个统一的包装

sns_api/__init__.py
任何人都可以提供帮助?

在每个模块中都有一个“工厂”功能,执行动态导入,并为加载的模块调用工厂。至少,这是一种方法。记住,python方法是“duck typing”,这样工厂返回一个对象,客户端通过“duck calls”使用它:-

,我只需要两个

if platform == 'facebook':
    from pyfacebook import FaceBook as Platform
elif platform == 'myspace':
    from pymyspace import Myspace as Platform
else:
    raise RuntimeError, "not a valid platform"
并在代码的其余部分使用
Platform
。在库中这样做,请参阅
os
模块

您可以使用
name=
('module')
进行真正的动态导入,但您可能不需要它。

您还可以使用exec:

exec "from sns_api.%s import Platform" % PLATFORM
然后在您的实现文件中,为平台分配一些内容:

# in pyfacebook.py
class Facebook:
   def __init__(self, a, b):
       # do the init
   def method1(self, a, b, ...):
       # do the logic

Platform = Facebook