Python抽象模块可能吗?

时间:2014-03-18 21:36:56

标签: python module abstraction

我在一个文件中用Python构建了一个模块而没有使用类。我这样做是为了使用一些api模块变得更容易。基本上是这样的:

the_module.py

from some_api_module import some_api_call, another_api_call

def method_one(a, b):
    return some_api_call(a + b)

def method_two(c, d, e):
    return another_api_call(c * d * e)

我现在需要为不同的api模块构建许多类似的模块,但我希望它们都具有相同的基本方法集,以便我可以导入任何这些模块并调用一个函数,知道此函数将表现在我建立的所有模块中都是一样的。为了确保它们完全相同,我想使用某种抽象基础模块来构建。我通常会抓住Abstract Base Classes module,但由于我根本不使用类,所以这不起作用。

有谁知道如何实现一个抽象基础模块,我可以在不使用类的情况下构建其他几个模块?欢迎所有提示!

1 个答案:

答案 0 :(得分:0)

您没有使用类,但您可以轻松地重写代码来执行此操作。 类基本上是包含函数和变量的命名空间,模块也是如此。 无论是拨打mymodule.method_one()还是mymodule.myclass.method_one(),都不应该产生巨大的影响。

在python中没有你可能从java知道的接口。 python中的范例是Duck typing,这或多或少意味着对于给定模块,如果它提供了正确的方法,您可以判断它是否实现了API。 Python会这样做,即确定如果在类myclass的实例上调用myobject[i]该怎么办。它会查看该类是否具有方法__getitem__,如果是,则将myobject[i]替换为myobject.__getitem__(i)。 你不必告诉python你的类支持这种访问,python只是从你定义你的类的方式中找出它。 您应该确定模块是否实现API。

也许您想在mymodule.__dict__之后查看隐藏的字典import mymodule,其中包含所有函数名称和指向模块的指针。然后,您可以检查是否存在正确的功能,否则会引发错误

import my_module_4
#check if my_module_4 implements api
if all(func in my_module_4.__dict__ for func in ("method_one","method_two"):
  print "API implemented"
else:
  print "Warning: Not all API functions found in my_module_4"