Python抽象模块可能吗?
我在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模块,但我希望这些模块都有一套基本的方法,这样我在导入这些模块时,就可以调用某个函数,并且知道这个函数在我写的所有模块里都能以相同的方式工作。为了确保它们都是一样的,我想用某种抽象基础模块来构建这些模块。通常我会使用抽象基类模块,但因为我根本不使用类,所以这个方法不适用。
有没有人知道我该如何在不使用类的情况下实现一个抽象基础模块,以便我可以在这个基础上构建其他模块?欢迎任何建议!
1 个回答
你现在没有使用类,但其实可以很简单地把你的代码改成使用类。类基本上就是一个命名空间,里面可以放函数和变量,就像模块一样。无论你是调用 mymodule.method_one()
还是 mymodule.myclass.method_one()
,其实差别不大。
在Python中,没有你可能在Java中听说过的接口。Python的编程方式叫做鸭子类型,这基本上就是说,只要一个模块提供了正确的方法,你就可以判断它是否符合你的API。比如,当你在你的类myclass的实例上调用 myobject[i]
时,Python会检查这个类是否有 __getitem__
这个方法。如果有,它就会把 myobject[i]
替换成 myobject.__getitem__(i)
。你不需要告诉Python你的类支持这种访问方式,Python会根据你定义类的方式自己判断出来。你也可以用同样的方法来判断你的模块是否实现了你的API。
也许你想在 import mymodule
之后查看一下隐藏的字典 mymodule.__dict__
,里面包含了你模块中所有函数的名字和指向它们的指针。这样你就可以检查是否有正确的函数存在,如果没有的话就抛出错误。
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"