python模块:命名空间与重载模块

文章目录

        • 模块命名空间:
        • 重载模块:

#module2.py
print('starting to load...')
import sys
name=42
def func():pass
class klass:pass
print('done loading.')
>>> import module2
starting to load...
done loading.
>>> module2.sys
<module 'sys' (built-in)>
>>> module2.name
42
>>> module2.func
<function func at 0x000001FB71072E18>
>>> module2.klass
<class 'module2.klass'>
>>> dir(module2)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'func', 'klass', 'name', 'sys']#moda.py:
X=88
def f():global XX=99
#modb.py:
X=11
import moda
moda.f()
print(X,moda.X)
#run modb.py:
>>> 
========================= RESTART: D:/python/modb.py =========================
11 99
#mod3.py:
X=3
#mod2.py:
X=2
import mod3
print(X,end=' ')
print(mod3.X)
#mod1.py:
X=1
import mod2
print(X,end=' ')
print(mod2.X,end=' ')
print(mod2.mod3.X)
#run mod1.py:
>>> 
========================= RESTART: D:/python/mod1.py =========================
2 3
1 2 3#changer.py:
message='First version'
def printer():print(message)>>> import changer
>>> changer.printer()
First version#改变changer.py并保存:
message = 'After editing'
def printer():print('reloaded:',message)
#在解释器下面输入及其对应的输出:
>>> import changer
>>> changer.printer()
First version
>>> from imp import reload
>>> reload(changer)
<module 'changer' from 'D:/python\\changer.py'>
>>> changer.printer()
reloaded: After editing

模块命名空间:

0.作用域和命名空间:

作用域针对变量而言,是变量名被赋值的位置,决定变量名能被访问到的范围。

命名空间:变量名建立所在的场所。

注意模块不是模块对象,模块的变量名也不是模块对象的属性,但是你导入模块之后,就都是了,也就是说作用域还是命名空间他们是没有具体的分别的。

模块对象的属性在模块文件的作用域里面建立,所以我们说,模块对象的作用域也是命名空间。

1.模块是一个独立的作用域,导入后,模块文件的作用域就变成了模块对象属性的命名空间。简而言之,模块就是命名空间,存在于模块之内的变量名就是模块对象的属性。

2.模块对象:模块可以被理解成变量名的封装,导入一个模块文件之后,python会建立模块对象,包含模块文件内所赋值的所有变量名。

3.模块文件变为模块对象的过程:模块语句在首次导入时执行,python建立空的模块对象,然后按照文件从头到尾顺序依次执行该模块文件内部语句。文件顶层赋值变量的语句,会建立模块对象的属性,赋值的变量名会存储在模块的命名空间里。

4.由导入而建立的模块的命名空间是通过辞典对象进行存储的,命名空间只是普通的字典对象,可以通过dir(M)获取,它还包含了类继承的变量名。我们在模块文件中赋值的变量名,在内部成为字典的键。字典中多数变量名都反映了文件中顶层的赋值语句,python也会在模块命名空间里加一些变量名,_file_指明模块从哪个文件加载,_name_指明导入者名称。

5.在模块中,模块范围会在模块加载后变成模块对象的属性辞典,函数的本地变量名只在函数执行时存在,但是模块的本地作用域和全局作用域相同。因此我们说:导入后,模块文件的作用域就变成了模块对象的属性的命名空间。

6.我来总结一下:导入一个模块,建立一个空的模块对象,然后执行模块中语句,如果有赋值变量的语句,那么就建立模块对象的属性,这个被赋值的变量名会被存到字典(命名空间)里,模块加载完之后,这个模块的作用域就是模块对象属性的命名空间,我们可以通过模块名和变量名(键/模块对象)获取命名空间里的属性(值)。

7.看中文也看不太明白,估计是翻译的锅,里面好多地方自相矛盾,我现在也没完全理解。到时候买个英文看看再过来修改吧。

1.点号运算符:object.attribute利用点号运算符获取任意对象object的attribute属性。点号运算是表达式,返回和对象相匹配的属性名的值。用点号运算符读取变量名时(属性),已经把对象给明确了。

如果只有一个简单变量,那么在当前作用域内找变量名x(遵循LEGB,无点号运算的纯变量名)

X.Y:当前范围内搜索X,然后搜索对象X中的属性Y。

X.Y.Z:寻找对象X中的变量Y,然后再找对象X.Y中的Z

点运算可用于任何具有属性的对象,比如模块,类

2.导入和作用域:

不导入文件,就无法存取该文件内定义的变量名。

在例子里,第二个模块modb定义了全局变量x,导入第一个模块,调用了第一个模块的函数。第一个模块的函数修改moda模块里的全局变量x,而不是modb中的x

我们可以看出,导入操作不会赋予被导入文件中(moda)代码对上层代码(modb)的可见度。函数无法看见其他函数内的变量名,除非它处于这个函数内。模块代码无法看见其他模块内的变量名,除非你把它导入到这个其他模块里。

3.命名空间的嵌套:

导入不会使命名空间发生向上的嵌套,但是会发生向下的嵌套。有可能深入到任意嵌套的模块中并读取其属性。

这里我们的例子:mod1导入mod2时,创建一个两层命名空间的嵌套,利用mod2.mod3.X就可以深入到mod3。也就是说,mod1可以访问三个文件的全局范围。

但是反过来则不可以,mod3无法看见mod2和mod1的变量名

import语句:将整个模块对象赋值给一个变量名

在mod1中,mod2只是一个 变量名,引用带有属性的对象,而该对象某些属性可能又引用其他带有属性的对象。我们可以说,mod1 import mod2 然后mod2.mod3.X

我们不能说import mod2.mod3。因为这个语句涉及包导入,包导入也会形成模块命名空间嵌套。其导入语句会反映目录树结构,而不是简单的导入链。

重载模块:

模块程序代码默认只对每个过程执行一次,强制使模块代码重新载入并运行,需要调用reload,在python3中,reload为于模块中,使用前需要导入。

只会在第一次导入模块时,加载和运行该模块的代码,之后的导入只会使用已经加载的模块对象,而不会重载或重新执行文件的代码。

reload会强制将已经加载的模块代码重新载入并重新执行,模块新代码的赋值语句会修改现有的模块对象。

利用reload可以立即看到对组件修改的效果。一般用法就像例子里的,导入一个模块,然后修改其代码,然后将其重载。调用reload时,python重新读取模块的源代码,然后执行顶层语句。reload会重新在当前命名空间内执行模块文件的新代码并且覆盖其现有的命名空间,而不会删除然后重建模块对象。

重载之后,模块对象的某些变量的值变成了新的值,因此会影响所有使用import读取了模块对象的客户端。

之前使用from读取属性的客户端不会受到影响,但是之后使用from的会受到影响。

重载的好处:

使程序提供高度动态的接口,用户可以在系统运作时编写python程序,而不用获取整个源代码,然后编译整个产品。而且对于那些启动时需要连接服务器的程序来说,利用重载就好太多了,因为我们虽然改动代码,但不用再重新启动。python真的动态,我喜欢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哪个html在大部分浏览器下是不隐藏的,前端浏览器兼容性问题总结

市场上浏览器种类很多&#xff0c;不同浏览器的内核也不尽相同&#xff0c;所以各个浏览器对网页的解析存在一定的差异。浏览器内核主要分为两种&#xff0c;一是渲染引擎&#xff0c;另一个是js引擎&#xff0c;内核更加倾向于说渲染引擎。常见的浏览器内核可以分四种&#xf…

多媒体分析与理解_如何设计一个出色的数字多媒体展厅?

展厅设计方案是了解每个多媒体设备的应用方法&#xff0c;那么如何让设备跟展厅结合一起&#xff0c;展示出我们想要的科技效果&#xff0c;核心就是用户体验度。今天华南数字科技的小编就为您介绍下数字多媒体展厅对用户体验方面的几个重点要素。1、细节展示不论多前卫的多媒体…

python模块:运行机制与编写方法

文章目录python模块的导入机制&#xff1a;python模块编写方法&#xff1a;#mod1: def printer(x):print(x) #mod2: print(hello) n1 #mod3: x1 y[2,3] >>> import mod1 >>> mod1.printer(hello) hello >>> from mod1 import printer >>> …

html标签a+hover事件,触发a标签hover事件,如何在元素底部显示蓝色底块_html/css_WEB-ITnose...

回复讨论(解决方案)你可以用li:hover border-bottom:3px solid blue;background-position:bottom; //是针对背景图片的位置,不是背景颜色height: 1px;//这里的高度为什么是1px?有什么目的&#xff1f;width:45px;可以采用1楼的做法&#xff0c;设置底部边框还有给你个动画效果…

微信小程序 界面从右边滑出_微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)...

本文实例讲述了微信小程序MUI侧滑导航菜单。分享给大家供大家参考&#xff0c;具体如下&#xff1a;实现的目标—-YDUI的Popup组件点击列表图标—-左侧的菜单栏显示—-点击关闭按钮或者右侧的遮罩层—-左侧菜单栏关闭实现方案1&#xff1a;左侧菜单和右侧展示页面分为上下两层w…

python函数:函数参数,常用函数工具

文章目录python函数之参数python的lambda表达式&#xff1a;函数工具&#xff1a;map&#xff0c;filter&#xff0c;reduce>>> def f(a):a99>>> b88 >>> f(b) >>> print(b) 88 >>> def ch(a,b):a2b[0]eoe>>> x1 >&g…

gradient设置上下渐变_图解CSS: CSS渐变

CSS的渐变主要分布在 conic-gradient()和repeating-conic-gradient()两个属性。在CSS中&#xff0c;CSS的渐变相当于图像&#xff0c;我们可以使用线性渐变(linear-gradient()和repeating-linear-gradient())、径向渐变(radial-gradient()和repeating-radial-gradient())和锥形…

2021泗阳致远中学高考成绩查询,2021高考成绩什么时候发布?可通过哪些途径查询?...

3、安徽省高考成绩预计将于6月23日公布各批次录取分数线和高考成绩&#xff0c;考生可通过安徽省教育招生考试院自行查分&#xff1b;4、湖南高考成绩将于6月25日左右公布&#xff0c;本科不再分一二三批&#xff0c;考生可通过湖南教育政务网、湖南省普通高校招生考试考生综合…

python函数之作用域

python函数之作用域&#xff1a; >>> def times(x,y):return x*y>>> times(2,4) 8 >>> times(3.1,4) 12.4 >>> times(eop,4) eopeopeopeop >>> def inset(s1,s2):res[]for x in s1:if x in s2:res.append(x)return res>>&…

mysql数据库的字符集_mysql数据库中字符集乱码问题原因及解决

前言有的时候我们在查看数据库数据时&#xff0c;会看到乱码。实际上&#xff0c;无论何种数据库只要出现乱码问题&#xff0c;这大多是由于数据库字符集设定的问题。下面我们就介绍一下&#xff0c;数据库的字符集的设定及乱码问题的解决。mysql数据库的字符集直白的说&#x…

加强计算机网络应用,如何加强计算机网络管理技术创新应用

车煜铭摘要&#xff1a;在社会的发展当中&#xff0c;计算机网络被普遍运用&#xff0c;因此&#xff0c;令人们对计算机网络的依赖性越来越大。长久以来&#xff0c;大部分计算机用户渴望获得一个稳定的网络氛围。为了符合这一需求&#xff0c;计算机网络管理系统随之诞生。其…

python基本语句

文章目录1.赋值语句序列赋值语句&#xff1a;多目标赋值语句&#xff1a;增强赋值语句&#xff1a;表达式语句2.条件语句和循环语句if语句&#xff1a;while循环&#xff1a;for循环&#xff1a;range计数器zip函数enumerate函数1.赋值语句 >>> a1 >>> b2 &…

mysql 经典面试_这些MySQL经典面试题你要知道!

1、MySQL的复制原理以及流程(1)、复制基本原理流程1. 主&#xff1a;binlog线程——记录下所有改变了数据库数据的语句&#xff0c;放进master上的binlog中&#xff1b;2. 从&#xff1a;io线程——在使用start slave 之后&#xff0c;负责从master上拉取 binlog 内容&#xff…

html乱码框框,springmvc+font-awesome开发出的页面显示方框乱码的解决方法

在web.xml中配置如下&#xff1a;springorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:conf/spring-mvc.xml2spring/default*.cssdefault*.gifdefault*.jpgdefault*.pngdefault*.jpegdefault*.jsdefault*.svgdefault*.eotdefault*.woffdef…

1主5从mysql数据库_MySQL主从复制虽好,能完美解决数据库单点问题吗?

一、单个数据库服务器的缺点数据库服务器存在单点问题&#xff1b;数据库服务器资源无法满足增长的读写请求&#xff1b;高峰时数据库连接数经常超过上限。二、如何解决单点问题增加额外的数据库服务器&#xff0c;组建数据库集群&#xff1b;同一集群中的数据库服务器需要具有…

python基本对象类型

文章目录python对象类型1.数字2.字符串3.列表4.字典5.元组6.文件7.其他核心类型python对象类型 1.数字 例子 >>> 123222 345 >>> 1.5*399 598.5 >>> 2**10 1024 >>> 3.1415*2 6.283 >>> 9.99991 10.9999 >>> import …

html响应式五栏布局,HTML – 响应式2列CSS布局,包括固定宽度的侧边栏?

在任何地方找不到解决方案(我猜这一定是一个非常常见的问题).我正在创建一个带侧边栏的响应式设计,其中侧边栏需要具有200px的固定宽度并且具有未知高度.我怎样才能使主要内容区占据所有剩余的宽度,而不会有任何不当行为.最接近我的是以下内容,但问题在于侧边栏可以与页脚重叠.…

js语句连接mysql数据库_js中require()的用法----JS如何连接数据库执行sql语句或者建立数据库连接池...

var vue require(vue);引入vue的意思&#xff0c;commonjs的写法。node都是用require来载入模块的&#xff0c;可以看看webpackvue。require()可以调用模块。这不是就把vue模块命了个名吗&#xff1f;nodejs的写法&#xff0c;引入vue模块并命名为vue的意思。前端的东西&#…

(DFS)迷宫问题

题目&#xff1a; 从s到t,.意味着可以走&#xff0c;*意味着不能走&#xff0c;如果能走&#xff0c;输出路径&#xff0c;如果不能走&#xff0c;输出no。 输入&#xff1a; 5 6 ....S* .***.. .*..*. *.***. .T....输出&#xff1a; ....m* …

惠普z6计算机进不去桌面,HP Z6 桌面工作站 | HP® HK 惠普香港

Intel、Thunderbolt 及 Xeon 均為 Intel Corporation 於美國及/或其他國家或地區的商標。Microsoft 及 Windows 為 Microsoft Corporation 於美國及/或其他國家或地區的註冊商標或商標。NVIDIA 是 NVIDIA Corporation 在美國及其他國家或地區的商標及/或註冊商標。USB Type-C™…