为了账号安全,请及时绑定邮箱和手机立即绑定
1. 命名空间的定义

命名空间 (Namespace) 是从名称到值的映射,大部分的命名空间都是通过 Python 字典来实现的,它的键就是变量名,它的值是变量的值。

3. 合并命名空间

合并多个具有相同名称的命名空间:导出成员不可重复定义非导出成员仅在其原有的(合并前的)命名空间内可见namespace A { let used = true export function fn() { return used }}namespace A { export function fnOther() { return used // Error, 未找到变量 used }}A.fn() // OKA.fnOther() // OK代码解释:第一个命名空间内的非导出成员 used 仅在第一个命名空间内可见。 命名空间对象 A 可以分别访问在第一个或第二个声明的导出成员。

2.2 全局命名空间

在 Python 的全局命名空间中,记录了模块级别的变量,包括变量、函数、类。Python 中的内置函数 globals() 返回表示全局命名空间的字典,示例如下:class Person: def __init__(self, name): self.name = namedef show(person): print(person.name)tom = Person('tom') jerry = Person('jerry')dict = globals()print(dict)在第 1 行,在全局空间定义了类 Person在第 5 行,在全局空间定义了函数 show在第 8 行,在全局空间定义了实例变量 tom在第 9 行,在全局空间定义了实例变量 jerry程序输出如下:{ '__name__': '__main__', '__doc__': None, '__package__': None, '__file__': 'globals.py', '__cached__': None, 'Person': <class '__main__.Person'>, 'show': <function show at 0x0000000001D03E18>, 'tom': <__main__.Person object at 0x0000000001E1BC50>, 'jerry': <__main__.Person object at 0x0000000001E1BCC0>, }输出包括了 Person、show、tom 和 jerry,它们是用户定义的全局函数和变量。

4.1 命名空间与类的合并

合并名称相同的命名空间与类:命名空间内的成员必须导出,合并后的类才能访问命名空间内导出的成员,相当于合并后类的静态属性命名空间要放在类的定义后面501注意: 命名空间要放在类的定义后面,命名空间内导出的成员,相当于合并后类的静态属性。

TypeScript 命名空间

命名空间同样是为了避免变量命名冲突,TypeScript 官方将命名空间视为“内部模块”,上节介绍的模块被视为“外部模块”。如果声明相同名称的命名空间,TypeScript 编译器会将其合并为一个声明,具体的合并规则会在下节介绍。

2.3 局部命名空间

在 Python 的局部命名空间中,记录了函数的参数和局部变量。Python 中的内置函数 locals() 返回表示局部命名空间的字典,示例如下:def function(a, b): c = 3 d = 4 dict = locals() print(dict)function(1, 2)在第 1 行,函数 function 定义了参数 a 和 b在第 2 行,函数 function 定义了局部变量 c在第 3 行,函数 function 定义了局部变量 d程序输出如下:{'a':1, 'b':2, 'c':3, 'd':4}输出包括了 a、b、c 和 d,它们是函数的参数和局部变量。

4.2 命名空间与函数的合并

名称相同的命名空间与函数挂载同一个对象命名空间要放在函数的定义后面502命名空间和函数可以进行合并,是因为在 JavaScript 中函数也是对象。

2. 三种命名空间

Python 中存在有三种命名空间:内置命名空间:记录了 Python 的内置函数全局命名空间:记录了模块级别的变量局部命名空间:记录了函数的参数和局部变量

1.2 在同一个命名空间中,不允许重名

在同一个命名空间中,每个变量的名称是唯一的,不允许重名。在下图中,尝试定义 2 个同名变量:图: 在同一个命名空间中,不允许重名命名空间中存在变量 b,取值为 2命名空间中存在变量 b,取值为 3因为处于同一个命名空间,这种情况是不允许的

4. 命名空间与其它类型的合并

只要命名空间的定义符合将要合并类型的定义,命名空间就可以与其它类型的声明进行合并,合并结果包含两者的声明类型。

3. 命名空间的查找顺序

Python 程序访问变量时,按照如下规则查找变量:在局部命名空间中,查找变量如果找不到,则在全局命名空间中,查找变量如果找不到,则在内置命名空间中,查找变量如果找不到,则抛出 NameError 异常下面的例子演示了查找顺序:a = 1b = 2def function(c, d): e = 5 f = 6 访问某个变量function(3, 4) 程序包含了 3 个命名空间内置命名空间,包括: max、min、abs 等内置函数全局命名空间,包括:a、b、function局部命名空间,包括:c、d、e、f在第 7 行,访问某个变量如果访问的变量是 c,则能在局部命名空间中找到如果访问的变量是 a,则能在全部命名空间中找到如果访问的变量是 max,则能在内置命名空间中找到如果访问的变量是 x,在以上三个命名空间中查找不到,抛出异常 NameError

1.3 在不同的命名空间中,允许重名

在下图中,存在两个不同的命名空间:命名空间 A 和命名空间 B。图: 在不同的命名空间中,允许重名在命名空间 A 中,有 3 个变量 a、b、c,取值分别是 1、2、3在命名空间 B 中,有 3 个变量 a、b、c,取值分别是 11、22、33因为处于不同的命名空间,这种情况是允许的

2. 命名空间的本质

命名空间本质上就是一个对象,将其内部的变量组织到这个对象的属性上:namespace Calculate { const fn = (x: number, y: number) => x * y export const add = (x: number, y:number) => x + y}来看其编译后的结果:"use strict";var Calculate;(function (Calculate) { var fn = function (x, y) { return x * y; }; Calculate.add = function (x, y) { return x + y; };})(Calculate || (Calculate = {}));那么,我们就可以访问 Calculate 对象上的 add 属性了:Calculate.add(2, 3)命名空间主要是为解决全局作用域内重名问题,而这一问题随着模块化编程的使用,已经得到了解决。

2.1 内置命名空间

Python 解释器内置了很多函数, 不需要使用 import 导入即可使用,例如:>>> max(1, 2)2>>> abs(-123)123函数 max 计算最大值函数 abs 计算绝对值Python 程序可以直接使用这两个内置函数Python 提供了一个内置命名空间,用于记录这些内置函数。Python 中存在一个特殊的 builtins 模块,它记录了所有的内置函数,示例如下:>>> import builtins>>> dir(builtins)['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ZeroDivisionError', 'abs', 'all', 'any','ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']>>>在第 1 行,导入 builtins 模块在第 2 行,使用 dir 列出 builtins 模块中的变量和函数的名称>>> m = builtins.max>>> m(1, 2)2>>> a = builtins.abs>>> a(-123)123在第 1 行,引用 builtins 命名空间中的 max 函数在第 4 行,引用 builtins 命名空间中的 abs 函数

4.3 命名空间与枚举的合并

命名空间可以用来扩展枚举型:500解释: 枚举本身也是个对象,与命名空间对象合并后对象的属性进行了扩充。

3.1 命名规范

变量命名只能使用英文字母,数字和下划线,首字母不能以数字开头例如正常变量:BASE_DIR,File_Name,AEG3,_DIR 等都是正常的变量无效变量:1file,#dir变量名中间不能使用空格或标点符号例如:DIR FILE,DIR?FILE 就为无效变量变量命名不能使用 base 里面的关键字(help 来查看关键字)Shell 变量大小写敏感,也就是定义为大写的变量名,引用的时候必须完全一致。例如:DIRNAME 和 dirname 就是两个不同的变量

1.2 查看系统磁盘空间使用情况

可以使用 df -h 命令查看 Linux 磁盘空间使用情况,命令如下:df -h执行结果如下图:文件系统:表示的含义是设备的设备文件位置;容量:表示的含义是能容纳的空间大小;已用:表示的含义是已经用了多少空间大小;可用:表示的含义是还有多少空间大小可用;已用%:表示的含义是已经占用的空间比例;挂载点:表示的含义是设备挂载了那个挂载点上。

3. 定义控制器类

控制器文件通常放在 controller 目录下面,类名和文件名保持大小写一致,并采用驼峰命名(首字母大写),一般控制器的名称定义带有 Controller 后缀,为了演示方便,这里在 study.php 路由文件先定义一个 GET 路由,指向一个控制器:Route::get('imooc', 'app\controller\Study\ImoocController@get');如下图所示:Tips: 如上图所示路由指向的控制器是 app\controller\Study 目录下的 ImoocController 控制器中的 get 方法。接下来在 app\controller\Study 目录下新建一个文件名是 ImoocController.php 的 ImoocController 类,可以使用 PhpStorm 软件来创建,它可以自动补上类名和命名空间:在新弹出的窗口中输入 ImoocController 即可完成创建:Tips: 如果没有 PhpStorm 软件则可以按照如图所示的内容编写。

1. 数据表命名规范

数据表命名是小写字母和下划线 _ 组成,用来分割不同单词之间的含义,例如 “student_course” 表示学生选课关联表,实际命名需要根据具体功能而定,好的命名规范在实际工作中也是很重要的。

1. 官方定义

grid-template-columns 该属性是基于 网格列. 的维度,去定义网格线的名称和网格轨道的尺寸大小。grid-template-rows 该属性是基于 网格行 的维度,去定义网格线的名称和网格轨道的尺寸大小。repeat() 函数表示轨道列表的重复片段,允许以更紧凑的形式写入大量显示重复模式的列或行。auto-fill和 auto-fit 属性规定如何填充列(是否进行协调)。fr fr 单位被用于在一系列长度值中分配剩余空间,如果多个已指定了多个部分,则剩下的空间根据各自的数字按比例分配。minmax() 定义了一个长宽范围的闭区间, 它与 CSS 网格布局一起使用。grid-auto-columns 指定了隐式创建的网格纵向轨道(track)的宽度grid-auto-rows 用于指定隐式创建的行轨道大小。

2.1 命名

在定义变量时最好使用驼峰命名(如:aaBbCc)的方式,并且要使用有准确意义的变量名,这样容易阅读。// badvar getname = function() { return 'imooc'; }// goodvar getName = function() { return 'imooc'; }在声明变量时不要添加没必要的上下文,如果你的类名称 / 对象名称已经说明了它们是什么,不要在 (属性) 变量名里重复。// badconst dog = { dogType: '斗牛犬' dogColor: '黑色',};dog.dogType = '牧羊犬'// goodconst dog = { type: '斗牛犬' color: '黑色',};dog.type = '牧羊犬'

Linux 磁盘空间

前面小节介绍了 Linux 进程相关的基础知识,本小节介绍 Linux 磁盘空间相关的基础知识,管理好 Linux 磁盘空间对软件程序运行有很重要的作用,磁盘空间的合理分配和清理能很好地降低服务器存储成本,查看磁盘空间还能保证程序软件正常运行。

5.2 客户端定时发送空包

实例:public class HeartBeatTimerHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { //发送空包 scheduleSendHeartBeat(ctx); } private void scheduleSendHeartBeat(ChannelHandlerContext ctx) { ctx.executor().schedule(() -> { if (ctx.channel().isActive()) { //发送空包(定义一个实体) ctx.writeAndFlush(Unpooled.EMPTY_BUFFER); } }, 3, TimeUnit.SECONDS); }}代码说明:借助 EventLoop 的定时线程池去实现每隔 3 秒钟发送一个空包;空包数据,自定义一个实体即可;主要的是空包的时间间隔(3s)一定要小于心跳监听的时间间隔(5s)。

1.1 自定义网桥

除了使用默认 docker0 做网桥,我们还可以使用 docker network 相关命令自定义网桥:这里将创建一个网桥 br0,设定网段是 172.71.0.0/24,网关为 172.71.0.1:docker network create -d bridge --subnet '172.71.0.0/24' --gateway '172.71.0.1' br0# -d 指定管理网络的驱动方式,默认为bridge# --subnet 指定子网网段# --gateway 指定默认网关使用命令 docker network ls 查看当前的 docker 网络列表,发现新增的 br0 网桥。接下来,我们尝试在使用这个网桥 br0 来新建运行两个容器,并测试它们的连通性。使用 busybox 镜像分别运行 b2,b3 两个容器:docker run -d -t --network br0 --name b2 busyboxdocker run -d -t --network br0 --name b3 busybox容器新建并运行成功后,分别执行下列命令,互相 ping 一下验证网络连通:docker exec b2 ping b3docker exec b3 ping b2ping 测试过程中,输入的并不是 IP,而是容器名。在自定义网桥中,容器名会在需要的时候自动解析到对应的 IP,也解决了容器重启可能导致 IP 变动的问题。其他不再使用的容器记得删除掉,释放资源和空间docker rm -f b2 b3docker network rm br0 # 删除自定义的网桥

2.4 命名管道

命名管道(Named Pipe)实际上就是先进先出队列(First In First Out,简称 FIFO),候选人需要区分命名管道和管道,两者最大的区别在于管道只能在具有亲缘关系的两个进程之间通信,例如父子进程之间或者兄弟进程之间,命名管道则可以在任何两个进程之间通信,更加零活。命名管道的读写操作如图所示,用户进程 A 是写入进程,写入的消息是 1 2 3 4 5,因为遵循先进先出的原则,用户进程 B 读出的消息顺序也是 1 2 3 4 5。

4. 线程拥有私有空间的意义

我们知道,线程的私有空间中存储的数据,仅供当前线程自己使用,其他线程不能够对数据进行访问。线程的私有空间会存放很多程序运行时所必须的数据,如:程序计数器:记录当前方法执行到了哪里,以便 CPU 切换回来之后能够继续执行上次执行到的位置,而不会进行重复执行或者遗漏。局部变量:局部变量是方法中的变量,只供当前方法使用。方法参数:Java 方法会定义自己的入参,入参的真实值也会记录到内存空间供当前线程使用。由于线程的内存空间会存放很多数据,这里只提以上三中数据以供同学理解线程私有空间的意义。为了加深理解,我们一起看一个简单的代码示例并进行分析:public class DemoTest{ public static void main(String[] args) { sum(10); // 解析点 3 } public static void sum(int num) { int i = 5; // 解析点 1 set(); //解析点 2 System.out.println("num+i = "+ (num + i)); } public static void set() { int i = 100; }}在给出结果之前,我们来分析下:解析点 1 :设置 i 的值为 5;解析点 2: 调用 set() 方法,逻辑如下。public static void set() { int i = 100; }那最终的结果是多少呢?解析点 3:我们传入的 sum 的参数值是 10,如果想确定结果,只要确定另外一个加数 i 的值就行了。我们通过分析,在方法 sum(int num) 中的 int i = 5 与方法 set() 中的 int i = 100 是两个不同的方法的局部变量,属于线程私有的。互相不会影响,所以set() 方法中的 int i = 100 不会影响最终的结果:num+i = 15

2.1 变量的定义

在使用 Shell 变量前,需要先定义变量,定义变量的方式有三种:2.1.1 直接赋值顾名思义就是直接将一个值赋值给一个变量名称,这种需要注意值中不能包含空白字符例如:正确的直接赋值变量:DIR=/tmp,其中 DIR 为变量名,/tmp 为值错误的直接赋值:STRING=hello Shell,其中 STRINNG 为变量名,hello Shell 为值,其中值包含了空白字符,这种赋值变量就是错误的。2.1.2 单引号赋值如果值中为普通字符,那么单引号赋值与双引号赋值没有区别,其可以包含空白字符,但是如果其中包含了变量的使用,那么单引号赋值方式为单引号里面的内容是什么就输出什么,此种赋值方式适用于不希望解析变量的场景,仅显示纯字符串。例如:[root@master ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@master ~]# DIR='$PATH'[root@master ~]# echo $DIR$PATH[root@master ~]# DATE='$(date)'[root@master ~]# echo $DATE$(date)PATH 为 linux 系统内置的一个环境变量,DIR 为我们定义的变量,值为单引号引起来的 $PATH,查看其内容也为 $PATH,同理对于执行 date 命令。2.1.3 双引号赋值与单引号赋值一样,其也可以包含空白字符,但是与单引号赋值不同的是,双引号赋值可以解析引号内的变量或执行命令,即不是将双引号中的变量名和命令原样输出,而是解析其中变量的内容,然后进行输出。例如:[root@master ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@master ~]# DIR="$PATH"[root@master ~]# echo $DIR/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@master ~]# DATE="$(date)" [root@master ~]# echo $DATE Sun Mar 8 22:13:57 CST 2020可以通过与单引号示例对照查看,双引号赋值解析了 PATH 变量的值然后输出,同理对于执行命令 date。

4.4 属性嵌套

当我们在写 CSS 样式的时候,有些 CSS 属性具有相同的命名空间 (namespace),比如定义字体样式的属性: font-size ; font-weight ; font-family ; 它们具有相同的命名空间 font 。再比如定义边框样式的属性:border-radius ; border-color ; 它们具有相同的命名空间 border 。当然还有很多其他这种的属性,为了方便管理和避免重复输入,Sass 允许将属性嵌套在命名空间中,同时命名空间也可以具有自己的属性值,我们举例看一下:.box { border: { radius: 5px; color:red; } font: { family:'YaHei'; size:18px; weight:600; } margin: auto { bottom: 10px; top: 10px; };}上面这种写法将会被转换为如下的 CSS 代码:.box { border-radius: 5px; border-color: red; font-family: "YaHei"; font-size: 18px; font-weight: 600; margin: auto; margin-bottom: 10px; margin-top: 10px;}

1.1 例子

一个包含 3 个变量的命名空间,如下图所示:图: 定义了 3 个变量的命名空间第一个变量名为 a,值为 1第二个变量名为 b,值为 2第三个变量名为 c,值为 3

2.3 自定义域名

如果你觉得默认的域名不好记忆,也可以在这里自定义成你觉得好记的域名,完成之后访问新的域名验证是否成功即可。

首页上一页1234567下一页尾页
直播
查看课程详情
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号