如何扩展或猴子补丁内置模块

2 投票
3 回答
578 浏览
提问于 2025-04-18 08:49

我想为我的团队写一个自定义的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

这样做是行不通的,因为你觉得Python怎么知道该选哪个呢?

必须换个名字,只要你想让import json导入正确的模块。

想了解更多类似的问题,可以看这里

1

我还有一个建议,就是使用一个包。

把你的 json.py 模块放到某种包里。

比如:

common
|-__init__.py
|-json.py

common 加入到你的 PYTHONPATH 中,或者把它打包成一个合适的 setup.py,这样你的团队就可以在他们的项目中安装和使用了。

然后可以这样导入:

from common import json

详情请见: https://docs.python.org/2/tutorial/modules.html

撰写回答