标签:char 命名空间 关键字 func spec 完成 轻松 系统变量 ssi
当我们新建一个python file,这个时候形成一个.py后缀的文件,这个文件就称之为模块
在pycharm中,我们右键可以创建一个目录,也可以创建一个包,两者看起来差不多,唯一的区别在于,创建包的时候,包下面会有一个__init__.py的文件,这也是python为了区分目录跟包所作出的界定
包下面,还能新建包,称之为子包
命名空间是变量到对象的映射集合。一般都是通过字典来实现的。主要可以分为三类:
通俗点讲:命名空间就是为了确定全局唯一,当模块A中有变量c,模块B中也有一个变量c,此时,通过A.c来确定引用A中变量c.123
比如在class2模块中要引用class1中的变量a,在导入class1模块之后,可以使用class1.a访问class1中的变量
当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:
msg = "msg" def my_func(): name = " wiggin " def func_son(): name = "xdclass " # 此处的name变量,覆盖了父函数的name变量 print(name) # 调用内部函数 func_son() print(name) my_func()
a = 1 def my_func(str): if a == 1: print(str) a = 24 my_func("file")
上面的程序会在报错,UnboundLocalError: local variable ‘a‘ referenced before assignment, 错误的意思就是a这个变量在引用前还没有定义,这上面不是定义了么?
对上面的错误进行修改,如下
a = 1 def my_func(str): global a if a == 1: print(str) a = 24 my_func("file") print(a) 输出结果: file 24
局部命名空间可以 locals() 来访问
def my_func(): a = 1 b = 2 print(locals()) my_func() 输出结果: {‘a‘: 1, ‘b‘: 2}
locals 返回一个名字/值对的 dictionary。这个 dictionary 的键是字符串形式的变量名字,dictionary 的值是变量的实际值。
全局 (模块级别)命名空间可以通过 globals() 来访问
a = 1 b = 2 print(globals()) 输出结果: { ‘__name__‘: ‘__main__‘, ‘__doc__‘: None, ‘__package__‘: None, ‘__loader__‘: <_frozen_importlib_external.SourceFileLoader object at 0x00000255B062F548>, ‘__spec__‘: None, ‘__annotations__‘: {}, ‘__builtins__‘: <module ‘builtins‘ (built-in)>, ‘__file__‘: ‘C:/Users/wiggin/Desktop/xdclass/chapter12/class2.py‘, ‘__cached__‘: None, ‘a‘: 1, ‘b‘: 2 }
locals 与 globals 之间的区别
def my_func(): x = 123 print(locals()) locals()["x"] = 456 print("x=", x) y = 123 my_func() globals()["y"] = 111 print("y=", y)
在python中,可以使用import 关键字进行模块的导入,语法如下:import module_name
例如,在模块class2中要引用同目录下class1中的变量a,此时可以如下
import class2 print(class2.a)
这个时候,需要使用命名空间来访问相应的变量
这样导入似乎很轻松,但是如果模块名长了,代码写起来就有点别扭了,比如:
import xdclass_python_chapter12_class3 print(xdclass_python_chapter12_class3.name)
这样的代码看起来非常拖沓,这个时候我们想让代码看起来简短些,我们可以使用别名,具体语法如下:import module_name as alias
# 导入模块并重命名为xd import xdclass_python_chapter12_class3 as xd print(xd.name)
当一个模块首次被导入时,Python 会搜索该模块,如果找到就创建一个 module 对象并初始化它。 如果指定名称的模块未找到,则会引发 ModuleNotFoundError。 当发起调用导入机制时,Python 会实现多种策略来搜索指定名称的模块。
注意:当模块首次被导入时,会执行模块里面的代码
我们修改下代码,xdc;ass_python_chapter12_class3模块里的内容改成:
print("hello world")
此时,我们仅仅导入模块,之后运行
import xdclass_python_chapter12_class3 as xd 输出结果: hello world
还有另外的方法可以导入模块:
使用importlib模块进行模块的导入,基本语法如下
import importlib importlib.import_module("module_name")
例如:
import importlib module = importlib.import_module("xdclass_python_chapter12_class3")
如果想导入另一个包中的模块,可以使用如下语法:
from package import module
如果想导入多层包中的模块,可以使用如下语法:
from package.son import module
能否像导入一个模块那样单独导入一个模块里的某个变量?带着疑问先动手
import class3.a as a print(a) 运行结果: Traceback (most recent call last): File "C:/Users/wiggin/Desktop/xdclass/chapter12/class4.py", line 1, in <module> import class3.a as a ModuleNotFoundError: No module named ‘class3.a‘; ‘class3‘ is not a package
显然,此路不通,那么如何导入一个变量呢?我们是以使用如下语法
from module import variable
其语义也非常好理解,字面上的意思就是从xxx导入xxx
from class3 import a print(a)
这个时候再去运行就会发现不会报错,能正常运行
同样注意:当模块首次被导入时,会执行模块里面的代码
我们修改class3的内容:
a = 1111 print("hello world")
再次运行class4文件,就会发现,同样也会先输出hello world,再打印a的值。
如果要导入多个变量,可以使用逗号分隔
from class3 import a, b print(a) print(b)
当要导入的变量非常多的时候,可以使用*进行导入
class3.py
a = 1 b = 2 c = 3
from class3 import * print(a) print(b) print(c)
虽然支持*通配符进行导入,但是不建议过多使用,因为使用*导入,阅读代码这难以理清其语义
对于 from class5_import import a
以下两模块,能否正常导入
模块 class5.py
from class5_import import a b = 11 print(a) from class5_import import ab = 11print(a)
模块 class5_import.py
from class5 import b a = 1
执行过程如下:
1、执行class5.py中的from class5_import import a
2、执行class5_import.py中的 from class5 import b
3、再次执行class5.py中的from class5_import import a
流程图如下
在前面的课程中,我们使用from package import * 会报错误,如果想使用该语法不报错,可以在__init__.py中定义要导入的模块
我们可以在__init__.py文件中,使用__all__ = [‘module_name1‘,‘module_name2‘]定义*号匹配时要导入的模块,之后再导入的时候,就可以使用*通配符进行模糊导入
当我们的许多模块中,都需要导入某些公共的模块,此时,可以在__init__.py中进行导入,之后直接导入该包即可
def my_fun(): if __name__ == "__main__": print("this is main") my_fun()
标签:char 命名空间 关键字 func spec 完成 轻松 系统变量 ssi
原文地址:https://www.cnblogs.com/jwen1994/p/13127377.html