我在一个文件中用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,但由于我根本不使用类,所以这不起作用。
有谁知道如何实现一个抽象基础模块,我可以在不使用类的情况下构建其他几个模块?欢迎所有提示!
答案 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"