如何扩展或猴子补丁内置模块
我想为我的团队写一个自定义的json模块。
首先,我在文件夹(命名空间)'dqa_fileio/config'下创建了一个'json.py'文件。
这样,当其他人想使用我的模块时,就可以通过 import dqa_fileio.config.json
来调用。
接着,我想创建一个 read_file
方法来加载一个json文件。
但是我遇到了一个错误,提示 AttributeError: 'module' object has no attribute 'load'
。
我觉得这可能是因为文件名叫做json.py。
不过我想保留这个文件名,有没有像Ruby那样的方法,可以打开一个类来扩展它的功能?但看起来 json
是一个文件夹(命名空间),而不是一个类?如果我有什么错误的理解,请指正我。谢谢。
json.py(在命名空间 dqa_fileio/config 下)
import json
class Json(object):
def __init__(self):
pass
def read_file(self, file_name):
return json.load(open(file_name, 'r'))
if __name__ == '__main__':
Json().read_file(sys.argv[1])
3 个回答
0
问题在于,Python认为导入json就是在导入它自己,而你的类里没有load这个方法。解决这个问题的唯一办法就是改一下你的文件名,或者使用一些不太符合Python风格的循环导入。
1
1
我还有一个建议,就是使用一个包。
把你的 json.py
模块放到某种包里。
比如:
common
|-__init__.py
|-json.py
把 common
加入到你的 PYTHONPATH
中,或者把它打包成一个合适的 setup.py
,这样你的团队就可以在他们的项目中安装和使用了。
然后可以这样导入:
from common import json