Python的包与模块一直是我的薄弱环节,对于包与模块的介绍,Python的相关资料也比较少。
最近工作中看到一个框架的源码,其中用到了通过元类的方式将一个类自动注册给成为另外一个模块的类的属性,
且另一个模块的类的实例,为该类的一个属性,这样的话,后续对象之间就可以通过属性进行互相访问,非常方便。
先上几个我参考的链接:
python 包有无 __init__.py 文件的区别
https://blog.csdn.net/zhouguoqionghai/article/details/99697848
https://stackoverflow.com/questions/2699287/what-is-path-useful-for
Python中模块变量__path__在这段代码中怎么传进来的?
https://www.zhihu.com/question/67447987/answer/253317374
官方5. 导入系统的说明
https://docs.python.org/zh-cn/3.7/reference/import.html#the-import-system
1月15日更新。
Python中模块变量__path__在这段代码中怎么传进来的?
https://www.zhihu.com/question/67447987/answer/253317374
从这个问题进行切入吧,Python的包与模块,从字面意义上面来看
<module 'lib' from '/Users/shijianzhong/china_stock/lib/__init__.py'> <module 'lib.demo' from '/Users/shijianzhong/china_stock/lib/demo.py'>
一定要说区别,那可能是文件的路径名不一样,但在Python内部判断一个module是包模块还是文件模块,用的是该对象是否存在__path__属性。
包模块对象具有__path__属性,文件模块对象没有该属性。上面的例子中就是第一步判断是否具有__path__属性来判断是包还是模块。
在使用from xxx import yyy,如果xxx是一个包[一个带__init__的文件夹], 那import 首先的yyy就首先会去查寻xxx对象是否具有yyy属性,xxx对象的属性赋值可以在
__init__文件中完成,如果没有,就将自身的__path__属性里面的路径添加到sys.path的环境变量中,寻找与__init__同级的目录中是否有该模块。