模块与包
使用第三方包--包导入
导入是一种用来将其他包或其他包中的成员引入到当前程序中的机制。
单导入 别名导入 全导入 批量导入
导入名称冲突检查
包声明--------包声明
创建包和分发包
写程序的人需要的包管理器,和管理系统的人需要的包管理器
Cangjie
在仓颉编程语言中
包 package是编译的最小单元,每个包可以单独输出 AST 文件、静态库文件、动态库文件等产物.包由一个或多个源码文件组成,
模块 module 是若干包的集合,是第三方开发者发布的最小单元
###包声明
包声明以关键字 package 开头 包声明必须在源文件的非空非注释的首行
仓颉有 4 种访问修饰符:private、internal、protected、public,
pacakge 支持使用 internal、protected、public,默认修饰符为 public
###包的导入
包的导入
隐式导入:隐式导入 core 包
显示导入:使用 import 语句导入其它包中的声明或定义
使用 import as 对导入的名字重命名
###其他
扩展概述 扩展可以为在当前 package 可见的类型(除函数、元组、接口)添加新功能
C++和C
cmake 除了用 find_package 引入依赖,就是 add_subdirectory
编译成动态/静态库
make/autotools/cmake
Source
Python
module
包管理工具
pip、conda
包引入
import
包分发
Rust
Rust 也提供了相应概念用于代码的组织管理
项目(Packages)
因此它包含有独立的 Cargo.toml 文件,以及因为功能性被组织在一起的一个或多个包
工作空间(WorkSpace)
包(Crate):一个由多个模块组成的树形结构
Rust 而言,包是一个独立的可编译单元,它编译后会生成一个可执行文件或者一个库
包只是一个编译单元 库包和二进制包
模块(Module)
mod 关键字来创建新模块
可以使用 use 关键字把路径提前引入到当前作用域中,随后的调用就可以省略该路径
仓颉
仓颉为开发者提供了编译器、调试器、包管理器、静态检查工具、格式化工具和覆盖率统计工具等一整套仓颉开发工具链
安装配置 source cangjie/envsetup.sh
HOME路径(CANGJIE_HOME变量,指向Cangjie文件夹),PATH使用HOME指向bin目录
写程序的人需要的包管理器,和管理系统的人需要的包管理器 是不一样的
单脚本的形式
整个项目多个脚本一起运行
仓颉使用项目模式时,整个项目只允许存在一个 main 方法,放弃了像 Java 那样的运行每个脚本都写一个 main 方法的风格
src 目录对应的包名就是项目名,而 src 下的子目录都代表了一个子包
管理项目代码
终端输入 cjpm run 回车运行,
这种方式跟运行 Nodejs 项目是一样的,这是因为仓颉项目借鉴了 Nodejs 项目源码管理方式
,是用一个类似 package.json 的 cjpm.toml 去组织管理项目代码
“产物类型“的 “executable“,”static“,”dynamic“选项,生成不同的产物
构建当前文件,构建成功后,会生成target目录和cjpm.lock文件
cjc -p src/data --module-name data --output-type=staticlib -o data/liblog.a
项目管理
C++ : cmake工具链的环境变量配置
CMakeLists.txt
#include<>
mkdir build && cd build && cmake .. && make
./test
Java项目管理
定义包: 在Java中定义一个包很简单,只需要在文件的顶部添加一行代码: package 关键字定义,并且必须在文件的第一行
使用包: 在同一个包内的类可以互相访问,而无需使用 import 语句。访问不同包中的类,需要使用 import 语句
内置包 隐式导入
包搜索路径:
使用命令行 使用构建工具 使用IDE 集成开发环境(IDE,Integrated Development Environment )
包的 JAR 文件打包
四种类加载器
类加载器分为四种:前三种为虚拟机自带的加载器。
启动类加载器(Bootstrap) 由C++实现,负责加载java核心库 (加载的jar包路径:JAVA_HOME/jre/lib),如rt.jar
扩展类加载器(Extension) 负责加载java平台中扩展功能的一些jar包 (加载的jar包路径:JAVA_HOME/jre/lib/ext)
应用类加载器(AppClassLoader) 也叫应用类加载器,负责加载classpath中指定的jar包(加载开发者自己编写的java类)
用户自定义加载器 Java.lang.ClassLoader的子类,用户可以定制类的加载方式,一般不用
java5以后sun公司改进了JDK设计,JRE会自动搜索当前路径下的jar包,并自动加载dt.jar和tools.jar。
Node.js
使用npm init命令来初始化一个新的Node.js项目,这会创建一个package.json文件,其中包含项目的基本信息、依赖项等。
使用构建工具对于更复杂的应用,可以使用构建工具如Webpack、Babel等来处理JavaScript代码的编译和打包
python
pip install
_init_.py文件的文件夹包
import
import sys
sys.path.append()
python3 -c
包分发
路径:Python中,搜索路径(search path)是用来搜索模块(module)或者包(package)的。
在Python中,搜索目录主要包含如下三种来源:
脚本所在目录,即脚本目录;
全局的环境变量PYTHONPATH;
利用sys包,直接sys.path.insert或者sys.path.append而来的。
一个 module 内的 Python 代码通过 importing 操作就能够访问另一个模块内的代码。
import 语句是唤起导入机制的最常用方式,但不是唯一的方式。
importlib.import_module() 以及内置的 __import__() 等函数也可以被用来唤起导入机制
元钩子的注册是通过向 sys.meta_path 添加新的查找器对象,
查找器和加载器
参考
5. 导入系统 https://docs.python.org/zh-cn/3/reference/import.html