1.模块模块是包含python代码的文件。后缀名为.py,模块为python文件。为什么我们要用一个模块程序,太大了,编写和维护都很不方便。有必要拆分模块以增加代码重用。方法作为命名空间使用,避免命名冲突如何定义模块模块是一个普通的文件,所以可以直接写任何代码但是,根据模块的规范,最好在这个块写如下-函数(单个函数)-类(类似函数的组合,或者类似的业务模块)-测试代码如何使用模块模块直接导入-模块名直接以数字开头,需要使用importlib帮助语法importmodule_namemodule_name.function_namemodule_name.class_namecase01.py,02.py,p01.py,p02.py#Case01.py#包含一个学生类#一个sayHello函数#一个打印语句classStudent():def__init__(self,name="NoName",age=18):self.name=nameself.age=agedefsay(self):print("Mynameis{0}".format(self.name))defsayHello():print("Hi,")print("Iammodulep0")#Case02.py#在importlib包的帮助下,可以导入模块名称beginningwithnumbersimportimportlib#相当于导入一个名为01的模块,并将导入的模块赋值给aa=importlib.import_module("01")stu=a.Student()stu.say()#casep01.py#包含一个学生类#一个sayHello函数#一个打印语句classStudent():def__init__(self,name="NoName",age=18):self.name=nameself.age=agedefsay(self):print("Mynameis{0}".format(self.name))defsayHello():print("Hi,")#这个判断语句建议一直作为程序的入口if__name__=='__main__':print("Iammodulep01")#casep02.pyimportp01stu=p01.Student("xiaojing",19)stu.say()p01.sayHello()MynameisxiaojingHi,importmoduleasalias-导入时给模块起别名-其余用法同第一个one-casep03.py#casep03.pyimportp01aspstu=p.Student("yueyue",18)stu.say()我叫yueyuefrommodule_nameimportfunc_name,class_name-按照上面的方法选择性导入-使用时可以直接使用导入的内容,不需要前缀-casep04#casep04.pyfromp01importStudent,sayHellostu=Student()stu.say()sayHello()我叫NoNameHi,frommodule_nameimport*-从模块导入所有内容-casep05.py#Casep05.pyfromp01import*sayHello()stu=Student("yaona",20)stu.say()Hi,Mynameisyaonaif__name__==`__main__`可以有效避免模块代码导入时被动执行的问题。建议所有程序入口都使用这段代码作为入口2.模块搜索路径和存储什么是模块搜索路径当加载一个模块时,系统会在哪里寻找这个模块系统默认的模块搜索路径importsyssys.path属性可以获取路径列表#casep06.py#Casep06.pyimportsysprint(type(sys.path))print(sys.path)forpinsys.path:print(p)['D:\\python\\project\\包管理','D:\\PyCharmCommunityEdition2019.1.1\\helpers\\pydev','D:\\python\\project','D:\\PyCharm社区版2019.1.1\\helpers\\third_party\\thriftpy','D:\\PyCharm社区版2019.1.1\\helpers\\pydev','C:\\Users\\user\\.PyCharmCE2019.1\\system\\cythonExtensions','D:\\python\\project\\packageManage','D:\\Anaconda3\\envs\\opp\\python37.zip','D:\\Anaconda3\\envs\\opp\\DLLs','D:\\Anaconda3\\envs\\opp\\lib','D:\\Anaconda3\\envs\\opp','D:\\Anaconda3\\envs\\opp\\lib\\site-packages']D:\python\project\package管理D:\Py魅力社区版2019.1.1\helpers\pydevD:\python\projectD:\PyCharm社区版2019.1.1\helpers\third_party\thriftpyD:\PyCharm社区版2019.1.1\helpers\pydevC:\Users\user\.PyCharmCE2019.1\system\cythonExtensionsD:\python\项目\包管理D:\Anaconda3\envs\opp\python37.zipD:\Anaconda3\envs\opp\DLLsD:\Anaconda3\envs\opp\libD:\Anaconda3\envs\oppD:\Anaconda3\envs\opp\lib\site-packagesaddsearchpathsys.path.append(dir)模块的加载顺序搜索内存中已经加载的模块搜索python内置模块搜索sys.path路径包是一种组织和管理代码的方式,包存储模块。用于将模块一起包含的文件夹是包的结构custompackage|---package|---|---__init__.py包的标志文件|---|---模块1|---|---模块2|---|---子包(子文件夹)|---|---|---__init__.py|---|---|---子包模块1|---|---|---子包模块2packageimportpackage_name的导入操作直接导入一个包,可以使用__init__中的内容。py。:package_name.func_namepackage_name.class_name.func_name()这个方法访问的内容是pkg01,p07.py#pkg01.__init__pydefinInit():print("Iamininitofpackage")#pkg01.p01.py类学生():def__init__(self,name="NoName",age=18):self.name=nameself.age=agedefsay(self):print("Mynameis{0}".format(self.name))defsayHello():print("Hi,")print("Iammodulep01")#casep07.pyimportpkg01pkg01.inInit()Iamininitofpackageimportpackage_nameasp具体用法和功能与上面简单一致import注意,默认使用该方法导入__init__.py的内容班级。varcasep08.py#casep08.pyimportpkg01.p01stu=pkg01.p01.Student()stu.say()我是模块p01我的名字是NoNameimportpackage.moduleaspmfrom...importimportfrompackageimportmodule1,module2,module3,......该导入方法不执行__init__的内容frompkg01importp01p01.sayHello()frompackageimport*使用methodfunc_name()class_name.func_name()class_name.varcasep09.py,注意这个import的具体内容#casep09.pyfrompkg01import*inInit()stu=Student()我在包的初始化中NameError:name'Student'isnotdefinedfrompackage.moduleimport*使用方法func_name()class_name.func_name()在开发环境中,当前包中往往会引用其他模块,在当前包中可以直接导入其他模块中的内容。importcompletepackageormodulepath的用法__all__使用frompackageimport时,__init__.py中可以导入的内容如果文件为空,或者没有__all__,则只能导入__init__中的内容__init__如果设置了__all__的值,则加载__all__指定的子包或模块,所以不会加载到__init__中__all__=['module1','module2','package1'...]的内容pkg02,p10.py#pkg02.__init__.py__all__=['p01']definInit():print("Tamininitofpackage")#pkg02.p01.pyclassStudent():def__init__(self,name="NoName",age=18):self.name=nameself.age=agedefsay(self):print("Mynameis{0}".format(self.name))defsayHello():print("Hi,")#这个判断语句建议一直作为程序的入口if__name__=='__main__':print("Iammodulep01")#casep10.pyfrompkg02import*stu=p01.Student()stu.say()我的名字是NoName命名空间用于区分不同位置但功能不同但名称相同的函数或变量。使用特定的前缀来防止命名冲突setName()Student。设置名称()狗。设置名称()