当前位置: 首页 > news >正文

成都山而网站建设公司wordpress指定404

成都山而网站建设公司,wordpress指定404,企点qq,抚州市建设局官方网站模块1、什么是模块#xff1f;一个模块就是一个Python文件#xff0c;文件名就是模块名字加上.py后缀。因此模块名称也必须符合变量名的命名规范。1 使用python编写的代码(.py文件)2 已被编译为共享库或DLL的C或C扩展3 包好一组模块的包4 使用C编写并链接到python解释器的内置…模块1、什么是模块一个模块就是一个Python文件文件名就是模块名字加上.py后缀。因此模块名称也必须符合变量名的命名规范。1 使用python编写的代码(.py文件)2 已被编译为共享库或DLL的C或C扩展3 包好一组模块的包4 使用C编写并链接到python解释器的内置模块2、为什么要使用模块如果你退出python解释器然后重新进入那么你之前定义的函数或者变量都将丢失因此我们通常将程序写到文件中以便永久保存下来需要时就通过python test.py方式去执行此时test.py被称为脚本script。随着程序的发展功能越来越多为了方便管理我们通常将程序分成一个个的文件这样做程序的结构更清晰方便管理。这时我们不仅仅可以把这些文件当做脚本去执行还可以把他们当做模块来导入到其他的模块中实现了功能的重复利用3、如何使用模块方式一import方式二from ... import ...import首先自定义一个模块my_module.py文件名my_module.py,模块名my_modulename 我是自定义模块的内容...deffunc():print(my_module:, name)print(模块中打印的内容...)my_module在import一个模块的过程中发生了哪些事情#用import导入my_module模块importmy_module模块中打印的内容...#怎么回事竟然执行了my_module模块中的print语句importmy_moduleimportmy_moduleimportmy_moduleimportmy_moduleimportmy_module模块中打印的内容...#只打印一次从上面的结果可以看出import一个模块的时候相当于执行了这个模块而且一个模块是不会重复被导入的只会导入一次(python解释器第一次就把模块名加载到内存中之后的import都只是在对应的内存空间中寻找。)成功导入一个模块后被导入模块与文本之间的命名空间的问题就成为接下来要搞清楚的概念了。被导入模块与本文件之间命名空间的关系假设当前文件也有一个变量为 name local file 也有一个同名的func方法。#本地文件name local filedeffunc():print(name)#本地文件有跟被导入模块同名的变量和函数究竟用到的是哪个呢importmy_moduleprint(my_module.name) #根据结果可以看出引用的是模块里面的namemy_module.func() #执行的是模块里面的func()函数模块中打印的内容...我是自定义模块的内容...my_module: 我是自定义模块的内容...print(name) #使用的是本地的name变量func() #使用的是本地的func函数local filelocal file在import模块的时候发生了下面的几步1、先寻找模块2、如果找到了就在内存中开辟一块空间从上至下执行这个模块3、把这个模块中用到的对象都收录到新开辟的内存空间中4、给这个内存空间创建一个变量指向这个空间用来引用其内容。总之模块与文件之间的内存空间始终是隔离的给导入的模块取别名用as关键字如果导入的模块名太长不好记那么可以通过“import 模块名 as  别名”的方式给模块名取一个别名但此时原来的模块就不再生效了(相当于创建了新的变量名指向模块内存空间断掉原模块名的引用)。#给my_module模块取别名importmy_module as smprint(sm.name)我是自定义模块的内容...print(my_module.name) #取了别名后原来的模块名就不生效了NameError: namemy_module is not defined给模块去别名还可以使代码更加灵活减少冗余常用在根据用户输入的不同调用不同的模块。#按照先前的做法写一个函数根据用户传入的序列化模块使用对应的方法defdump(method):if method json:importjsonwith open(dump.txt, wb) as f:json.dump(xxx, f)elif method pickle:importpicklewith open(dump.txt, wb) as f:pickle.dump(xxx, f)#上面的代码冗余度很高如果简化代码通过模块取别名的方式可以减少冗余defdump(method):if method json:importjson as melif method pickle:importpickle as mwith open(dump.txt, wb) as f:m.dump(dump.txt, f)如何同时导入多个模块方式一每行导入一个模块importosimportsysimport time方式二一行导入多个模块模块之间通过逗号“,”来分隔import os, sys, my_module但是根据PEP8规范规定使用第一种方式并且三种模块有先后顺序(内置第三方自定义)#根据PEP8规范importosimportdjangoimport my_module模块搜索路径通过sys内置模块我们知道sys.path存储了所有模块的路径但是正常的sys.path的路径中除了内置模块第三方模块所在的路径之外只有一个路径是永远正确的就是当前执行的文件所在目录。一个模块是否能够被导入就取决于这个模块所在的目录是否在sys.path中。python解释器在启动时会自动加载一些模块可以使用sys.modules查看在第一次导入某个模块时(比如my_module)会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存)如果有则直接引用如果没有解释器则会查找同名的内建模块如果还没有找到就从sys.path给出的目录列表中依次寻找my_module.py文件。所以总结模块的查找顺序是内存中已经加载的模块-内置模块-sys.path路径中包含的模块需要特别注意的是我们自定义的模块名不应该与系统内置模块重名。模块和脚本运行一个py文件有两种方式但是这两种执行方式之间有一个明显的差别就是__name__。1、已脚本的方式执行cmd中“python xxx.py” 或者pycharm等IDE中执行__name__ __main__2、导入模块时执行import模块会执行该模块。__name__ 模块名然而当你有一个py文件既可以作为脚本执行又可以作为模块提供给其他模块引用时这时作为模块需要导入时而不显示多余的打印逻辑/函数调用所以这些逻辑可以放在“if __name__ __main__: xxx” 代码块中。这样py文件作为脚本执行的时候就能够打印出来以模块被导入时便不会打印出来。from ... import ...from...import是另一种导入模块的形式如果你不想每次调用模块的对象都加上模块名就可以使用这种方式。在from ... import ... 的过程中发生了什么事儿from my_module importname, funcprint(name) #此时引用模块中的对象时就不要再加上模块名了。func()1、寻找模块2、如果找到模块在内存中开辟一块内存空间从上至下执行模块3、把模块中的对应关系全部都保存到新开辟的内存空间中4、建立一个变量xxx引用改模块空间中对应的xxx 如果没有import进来的时候就使用不了。from ... import ... 方式取别名与import方式如出一辙通过from 模块名 import  对象名  as  别名。from my_module import name as n, func as ffrom ... import *import * 相当于把这个模块中的所有名字都引入到当前文件中但是如果你自己的py文件如果有重名的变量那么就会产生不好的影响因此使用from...import *时需要谨慎不建议使用。* 与 __all____all__是与*配合使用的在被导入模块中增加一行__all__[xxx,yyy]就规定了使用import *是只能导入在__all__中规定的属性。#在my_module模块中定义__all____all__ [name]name My module...deffunc():print(my_module:, name)#在其他文件中通过import *导入所有属性from my_module import *print(name)My module...func()NameError: namefunc is not defined拓展知识点(1)pyc文件与pyi文件 *pyi文件跟.py一样仅仅作为一个python文件的后缀名。pyc文件: python解释器为了提高加载模块的速度会在__pycache__目录中生成模块编译好的字节码文件并且对比修改时间只有模块改变了才会再次编译。pyc文件仅仅用于节省了启动时间但是并不能提高程序的执行效率。(2)模块的导入和修改 *1.导入模块后模块就已经被加载到内存中此后计算对模块进行改动读取的内容还是内存中原来的结果。2.如果想让改动生效可以通过“from importlib import reload”, 需要reload 模块名重新加载模块改动才生效。(3)模块的循环使用 ****谨记模块的导入必须是单链的不能有循环引用如果存在循环那么就是程序设计存在问题。(4)dir(模块名) ***可以获得该模块中所有的名字而且是字符串类型的就可以通过反射去执行它。包包是一种通过‘.模块名’来组织python模块名称空间的方式。(1)无论是import形式还是from ... import 形式凡是在导入语句中(而不是在使用时)遇到带点的都要第一时间提高警觉这是关于包才有的导入语法(2)包是目录级的(文件夹级)文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)(3)import导入文件时产生名称空间中的名字来源与文件import包产生的名称空间的名字同样来源与文件即包下的__init__.py导入包本质就是在导入文件注意1、在python3中即使包下没有__init__.py文件import包仍然不会报错而在python2中包下一定要有该文件否则import包会报错2、创建包的目的不是为了运行而是被导入使用记住包只有模块的一种形式而已包即模块包A和包B下有同名模块也不会冲突如A.a与B.a来自两个命令空间示例环境如下import osos.makedirs(glance/api)os.makedirs(glance/cmd)os.makedirs(glance/db)l []l.append(open(glance/__init__.py,w))l.append(open(glance/api/__init__.py,w))l.append(open(glance/api/policy.py,w))l.append(open(glance/api/versions.py,w))l.append(open(glance/cmd/__init__.py,w))l.append(open(glance/cmd/manage.py,w))l.append(open(glance/db/models.py,w))map(lambda f:f.close() ,l)创建目录代码glance/ #Top-level package├── __init__.py #Initialize the glance package├── api #Subpackage for api│ ├── __init__.py│ ├── policy.py│ └── versions.py├── cmd #Subpackage for cmd│ ├── __init__.py│ └── manage.py└── db #Subpackage for db│ ├── __init__.py│ └── models.py目录结构#文件内容#policy.pydef get():print(from policy.py)#versions.pydef create_resource(conf):print(from version.py: ,conf)#manage.pydef main():print(from manage.py)#models.pydef register_models(engine):print(from models.py: ,engine)文件内容从包中导入模块(1)从包中导入模块有两种方式但是无论哪种无论在什么位置都必须遵循一个原则(凡是在导入时带点的点的左边都必须是一个包)否则非法。(2)对于导入后在使用就没有这种限制点的左边可以是包模块函数类(它们都可以用点的方式调用自己的属性)(3)对比import item 和from item import name的应用场景如果我们想直接使用name那么必须使用后者。方式一import例如: 包名1.包名2.包名3.模块名#在与包glance同级别的文件中测试importglance.db.modelsglance.db.models.register_models(mysql)执行结果from models.py mysql方式二from ... import ...例如from 包名1.包名2 import 模块名from 包名1.包名2.模块名 import 变量名/函数名/变量名注意需要注意的是from后import导入的模块必须是明确的一个不能带点否则会有语法错误如from a import b.c是错误语法#在与包glance同级别的文件中测试from glance.db importmodelsmodels.register_models(mysql)执行结果from models.py mysqlfrom glance.cmd importmanagemanage.main()执行结果from manage.py直接导入包如果是直接导入一个包那么相当于执行了这个包中的__init__文件并不会帮你把这个包下面的其他包以及py文件自动的导入到内存如果你希望直接导入包之后所有的这个包下面的其他包以及py文件都能直接通过包来调用那么需要你自己处理__init__文件。__init__.py文件不管是哪种方式只要是第一次导入包或者是包的任何其他部分都会依次执行包下的__init__.py文件这个文件可以为空但是也可以存放一些初始化包的代码。绝对导入和相对导入我们的最顶级包glance是写给别人用的然后在glance包内部也会有彼此之间互相导入的需求这时候就有绝对导入和相对导入两种方式绝对导入以glance作为起始相对导入用. 或者.. 的方式作为起始(只能在一个包中使用不能用于不同目录内)绝对导入和绝对导入示例绝对导入既然导入包就是执行包下的__init__.py文件那么尝试在啊glance的__init__.py文件中import api,执行一下貌似没有报错在尝试下在包外导入情况如何在包外创建一个test.py文件在里面操作如下importglanceglance.apiModuleNotFoundError: No module namedapi原因为什么还会报错因为一个模块能不能被导入就看在sys.path中有没有路径在哪里执行文件sys.path永远记录该文件的目录。(1)在glance的__init__.py文件中sys.path的路径是E:\\Python练习\\包\\glance所以能够找到同级的api(2)但是在test文件中导入此时sys.path的路径是E:\\李彦杰\\Python练习\\包所以找不到不同层级的api所以就会报No module nameapi解决办法一使用绝对路径(绝对路径为当前执行文件的目录)(1)在glance包中的__init__.py中通过绝对路径导入from glance import api(2)这样在test文件中执行就能找到同层级的glance再去里面找api(3)同理如果想使用api包中的模块也要在api包中的__init__.py文件中导入from glance.api import policy, veersions,(4)现在在test文件中调用glance下的api下的policy模块就不会报错importglanceglance.api.policy.get()glance.api.versions.create_resource(测试)执行结果frompolicy.pyfromversions.py 测试绝对导入的缺点如果以后包的路径发生了转移包内的所有__init__.py文件中的绝对路径都需要改变解决办法二使用相对导入. 表示当前目录.. 表示上一级目录(1)在glance包中的__init__.py中通过相对路径的形式导入“from . importapi”(2)同理在api包中的__init__.py中通过相对路径的形式导入:“from . importpolicy,version”(3)同样在test文件中调用glance下的api下的policy模块就不会报错importglanceglance.api.policy.get()glance.api.versions.create_resource(测试)执行结果frompolicy.pyfromversions.py 测试相对导入的优点包发生路径转移其中的相对路径都没有改变所以不用逐个逐个修改。相对导入的缺点但凡带着相对导入的文件只能当做模块导入不能作为一个脚本单独执行扩展知识同级目录下的包导入需求现在需要在bin下面的start文件中导入core目录下的main模块怎么破project├── bin#Subpackage for bin├── __init__.py└── start.py├── core#Subpackage for core├── __init__.py└── main.py#main.py文件中的内容deffunc():print(In main)(1)、在start中直接导入,因为路径不对所以直接报错import main #执行报错ModuleNotFoundError: No module named main(2)、由上面报错我们知道肯定路径不对那么我们想到直接将core路径加进去不就好了吗是的这样是可行的importsyspath E:\练习\包\core #复制得到core的绝对路径sys.path.append(path) #将core路径添加import main #再次导入便不会报错main.func() #执行结果In main(3)、上面的方法看似可行但是还是有一个问题如果我将project打包发给别人或者我换个环境运行呢 那么又得更改对应的path。不怎么合理那么我们看下面的方法importsysprint(__file__)ret __file__.split(/)base_path /.join(ret[:-2])sys.path.append(base_path)from core importmainmain.func()#In main1、__file__ 可以得到当前文件的绝对路径E:/练习/project/bin/start.py2、__file__.split(/) 将当前文件的绝对路径进行处理按照/分隔得到[E:, 练习, project, bin, start.py]3、/.join(ret[:-2]) 因为我们只需要拿到project项目的动态路径所以进行切割在jojn得到 E:/练习/project4、sys.path.append(base_path) 再将得到的路径添加到sys.path中5、from core import main 因为我们拿到的是project目录所以导入是从当前路径的core包导入main模块6、main.func() 最后再是模块名.方法。
http://wiki.neutronadmin.com/news/931/

相关文章: