Python的好处在于,你不需要懂很多概念,你就有机会投入工作,同样,问题也有机会随时发生。
包、模块
foo
--bar.py
--sim.py
--__init___.py
简单来讲,包就是一个目录,而模块对应一个文件,包可以包含子包:
foo
--subf
--test.py
--testb.py
--__init__.py
--bar.py
--sim.py
--__init__.py
包的导入
假设我们在这些包中定义了一些简单的函数。
bar.py
# encoding: utf-8
# bar.py
def add(p1, p2):
return p1+p2
foo/subf/testb.py
# encoding: utf-8
# testb.py
def sub(p1, p2):
return p1-p2
同时所有的_init_.py文件内容都是空。
当完成一个包的定义时,我们可以在其他代码块中引用这些包。
from foo import bar
# 或者
import foo.bar
# 或者
from foo.bar import add
# 这种方式不推荐,会降低代码可读性,增加维护成本
from foo.bar import *
导入有一个前提。是foo包要在包所有路径内,这里就不再提这块了,可以参考本文引用。
包相对导入
如果当前模块是test.py,那么它可以这样使用相对导入使用其他模块的功能:
from .testb import sub
from ..bar import sub
隐式代码执行
当第一次引用其他模块时,会执行该模块全局范围的语句,sim.py定义如下:
# encoding: utf-8
# sim.py
print('This is a sample')
class A:
print('This is a sample in Class')
def __init__(self):
print('This is a sample in class method')
当该模块第一次被引用时,可以看到输出:
This is a sample
This is a sample in Class
引用https://stackoverflow.com/questions/448271/what-is-init-py-forstackoverflow.comhttps://docs.python.org/zh-cn/3/reference/import.htmldocs.python.orghttps://docs.python.org/zh-cn/3/tutorial/modules.htmldocs.python.org