Python内部的秘密——模块与类库

模块和类库

1.模块(Module) 是由一组类、函数与变量所组成,这些类等都存储在文本文件中。.py是Python程序代码文件的扩展名,模块可能是使用C或是Python写成。模块文件的扩展名可能是.py(原始文本文件),或是.pyc(编译过的.py文件)。在Python目录底下的Lib文件夹中,可以找到这些模块的.py文件。
在使用某个模块前必须先使用import语句加载这个模块。
语法格式为:
import <模块名称>
内置的函数dir() 可以找到模块内定义的所有名称。使用dir(模块名称)语句,显示模块的内容,结果以一个字符串列表的形式返回。
2.类库(Package) 是由一组相同文件夹的模块所组成,类库的名称必须是sys.path 所列的文件夹的子文件夹。每一个类库的文件夹中,必须至少有一个__init__.py文件。
类库可以包含子类库,子类库的文件夹位于该文件夹之下,子类库的文件夹中,也必须至少有一个__init__.py文件。
以Python目录底下的Lib子文件夹来说,xml是一个类库。其路径为Python目录\Lib\xml,Python目录\Lib\xml文件夹内有一个__init__.py文件,其下有dom、parsers、etree和sax三个子文件夹。dom,parsers,与sax都是xml类库的子类库,每一个子文件夹都有一个_init__.py文件。
3.模块和类库的基本操作

  • a、将模块改名:用户可以在Python解释器内将模块的名称,改成其他名称。
    语法格式为:

import 模块 as 新名称
或是
from 模块 import 函数 as 新名称

  • b、 模块的内置方法:下列都是__builtin__模块的内置方法,可以将这些方法应用在模块或是类库中。m变量代表模块或是类库。
m.__dict__:显示模块的字典
m.__doc__:显示模块的文件字符串
m.__name__:显示模块的名称
m.__file__:显示模块的完整文件路径
  • c、删除模块:用户可以使用del 语句来删除加载的模块,被删除的模块即从内存内清除。

  • d、 模块的命名空间:当用户在Python解释器内加载一个模块时,该模块即配置一个命名空间。

4.自定义模块
如果想将自定义的Python源文件作为模块导入,可以使用import语句。当解释器遇到import语句,会在当前路径下搜索该模块文件。
一个模块只会被导入一次
当适用import语句时,Python解释器会按如下搜索顺序从这些目录中去寻找引入模块:

  • a、解释器在当前目录中搜索模块的文件
  • b、到sys.path变量中给出的目录列表中查找
  • c、Python默认安装路径中搜索模块的文件

注意: 当前目录下定义的文件不能和标准模块重名,否则在导入标准模块时将会把那些定义的文件当成模块来加载,引发错误。
若想要使用一个存放在其他目录的Python程序,或者是其他系统的Python程序,可将这些Python程序制作成一个安装包并安装到本地,安装的目录可以选择sys.path文件中的任意一个目录。这样就可以在任何想要使用该Python程序的地方,直接使用import导入即可。
5.运行期服务模块
该模块组包含Python解释器以及环境变量相关的模块
在这里插入图片描述
5.1)、sys模块: 用于存取跟Python解释器有关联的系统相关参数,包括变量与函数

  • a、sys.argv:此对象包含应用程序的参数列表,argv[0]是应用程序的名称,argv[1]是应用程序的第一个参数,argv[2]是应用程序的第二个参数,以下类推。
  • b、sys.builtin_module_names:一个元组对象,包含所有与Python解释器编译在一起的模块名称字符串。
  • c、sys.copyright:一个Python相关著作权信息的字符串

5.2)、type模块: 包含Python内置类型的名称。可以使用Python解释器的type(obj)内置函数得到obj对象的内置类型。
5.3)operator模块: 含有所有Python标准运算符相对应的函数,operator模块是使用C语言写成的。例如:

  • a+b等于operator.add(a,b)或是operator.add(a,b)
  • a-b等于operator.sub(a,b)或是operator.sub(a,b)
  • a*b等于operator.mul(a,b)或是operator.mul(a,b)
  • a/b等于operator.truediv(a,b)或是operator.truediv(a,b)

6.字符串处理模块
该模块组提供各种操作字符串的函数
在这里插入图片描述
6.1)string模块: 提供一般的字符串操作函数与常量

  • a、string.capword(s):此函数先使用split()函数将字符串s分割,再使用capitalize()函数将每一个分割字符串的第一个字符转换成大写,最后使用join()函数将所分割的字符串连结起来。
  • b、string.digits:字符串“0123456789”
  • c、string.hexdidits:字符串“0123456789ABCDEF”,表示十六进制的各种字符
  • d、string.octdidits:字符串“01234567”,表示八进制的各种字符
  • e、string.whitespace:“字符串\t\n\x0b\x0c”。

6.2)re模块: 用来使用正则表达式(regular expression)运算。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获取匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他操作。
在这里插入图片描述
6.3)struct模块: 用于将Python的数据与二进制数据结构进行转换,转换后的二进制数据可应用于C语言和网络传输协议内。

  • a、struct.pack(fmt,v1,v2,…):将数值v1,v2等依照ftm的格式转换成字符串
    在这里插入图片描述
  • b、struct.unpack(fmt,string):将字符串strin依照fmt的格式转换成需要的数值
  • c、struct.calcsize(fmt):返回fmt结构的大小,即转换后的字符串大小

7.附属服务
在这里插入图片描述

  • a、math模块:提供标准的数学函数和常量。只接受整数和浮点数,不接受复数。提供两个标准常量:数学常量pi和e
  • b、random模块:用于做随机存取与产生随机数
    b.1)random.choice(seq):从列表seq中随机选取一个元素
    b.2)random.random(): 返回一个随机的浮点数,数值介于0.0与1.0之间

8.一般操作系统服务
在这里插入图片描述
9.其他模块组
在这里插入图片描述

常用模块 python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的。 常用的libraries(modules)如下: 1)python运行时服务 * copy: copy模块提供了对复合(compound)对象(list,tuple,dict,custom class)进行浅拷贝和深拷贝的功能。 * pickle: pickle模块被用来序列化python的对象到bytes流,从而适合存储到文件,网络传输,或数据库存储。(pickle的过程也被称serializing,marshalling或者flattening,pickle同时可以用来将bytes流反序列化为python的对象)。 * sys:sys模块包含了跟python解析器和环境相关的变量和函数。 * 其他: atexit,gc,inspect,marshal,traceback,types,warnings,weakref。 2)数学 * decimal:python中的float使用双精度的二进制浮点编码来表示的,这种编码导致了小数不能被精确的表示,例如0.1实际上内存中为0.100000000000000001,还有3*0.1 == 0.3 为False. decimal就是为了解决类似的问题的,拥有更高的精确度,能表示更大范围的数字,更精确地四舍五入。 * math:math模块定义了标准的数学方法,例如cos(x),sin(x)等。 * random:random模块提供了各种方法用来产生随机数。 * 其他:fractions,numbers。 3)数据结构,算法和代码简化 * array: array代表数组,类似list,list不同的是只能存储相同类型的对象。 * bisect: bisect是一个有序的list,其中内部使用二分法(bitsection)来实现大部分操作。 * collections:collections模块包含了一些有用的容器的高性能实现,各种容器的抽象基类,和创建name-tuple对象的函数。例如包含了容器deque,defaultdict,namedtuple等。 * heapq:heapq是一个使用heap实现的带有优先级的queue。 * itertools:itertools包含了函数用来创建有效的iterators。所有的函数都返回iterators或者函数包含iterators(例如generators 和generators expression)。 * operator: operator提供了访问python内置的操作和解析器提供的特殊方法,例如 x+y 为 add(x,y),x+=y为iadd(x,y),a % b 为mod(a,b)等等。 * 其他:abc,contextlib,functools。 4) string 和 text 处理 *codecs:codecs模块被用来处理不同的字符编码unicode text io的转化。 * re:re模块用来对字符串进行正则表达式的匹配和替换。 * string:string模块包含大量有用的常量和函数用来处理字符串。也包含了新字符串格式的类。 * struct:struct模块被用来在python和二进制结构间实现转化。 * unicodedata:unicodedata模块提供访问unicode字符数据库 5) python数据库访问 * 关系型数据库拥有共同的规范Python Database API Specification V2.0,MySQL,Oracle等都实现了此规范,然后增加自己的扩展。 * sqlite3: sqlite3 模块提供了SQLite数据库访问的接口。SQLite数据库是以一个文件或内存的形式存在的自包含的关系型数据库。 * DBM-style 数据库模块python提供了打了的modules来支持UNIX DBM-style数据库文件。dbm模块用来读取标准的UNIX-dbm数据库文件,gdbm用来读取GNU dbm数据库文件,dbhash用来读取Berkeley DB数据库文件。所有的这些模块提供了一个对象实现了基于字符串的持久化的字典,他字典dict非常相似,但是他的keys和values都必须是字符串。 * shelve:shelve模块使用特殊的“shelf”对象来支持持久化对象。这个对象的行为dict相似,但是所有的他存储的对象都使用基于hashtable的数据库(dbhash,dbm,gdbm)存储在硬盘。dbm模块的区别是所存储的对象不仅是字符串,而且可以是任意的pickle兼容的对象。 6)文件和目录处理 * bz2:bz2模块用来处理以bzip2压缩算法压缩的文件。
### Python 调用 .NET 类库方法和工具 在 Python 中调用 .NET 类库可以通过多种方式实现,其中最常用的是通过 `Python for .NET` (简称 `py/clr`) 工具来完成。以下是具体的方法和技术细节: #### 使用 `clr` 模块加载 .NET 组件 `clr` 是一个用于桥接 Python 和 .NET 的模块,允许开发者直接从 Python 加载并使用 .NET 库中的功能。 1. **安装依赖** 需要先安装 `pythonnet` 包,这是支持 `clr` 功能的核心包。 ```bash pip install pythonnet ``` 2. **导入 CLR 并加载 .NET 程序集** 下面是一个简单的例子,展示如何加载自定义的 .NET 程序集以及调用其内部的功能[^2]: ```python import clr # 添加对目标 DLL 文件的引用 clr.AddReference("TestPython.Core") # 导入命名空间下的类 from TestPython.Core import Man # 创建对象实例 m = Man() # 调用方法 result = m.Say("Hello, World!") print(result) ``` 3. **处理复杂数据结构** 如果需要传递更复杂的参数或者返回值,则可以利用 C# 或 VB.NET 提供的数据类型 Python 数据类型的映射关系来进行转换操作[^3]。 4. **注意事项** - 当前版本可能仅兼容特定框架环境(如 .NET Framework),对于 .NET Core/.NET 5+ 支持情况需单独确认。 - 开发过程中应确保运行时环境中已正确配置好相应的 GAC(Global Assembly Cache),以便能够正常解析外部依赖项。 --- #### 实际案例分析——基于 VB.NET 编写动态链接库(DLL) 按照之前提到过的实践经历说明文档内容来看,如果想让 Python 成功访问由 Visual Basic .NET 构建出来的组件资源的话,那么除了常规步骤之外还需要额外关注几个要点: - 设置项目的 COM 可见选项为开启状态; - 将生成的目标产物放置到适当位置使得解释器能找到它; 下面给出一段示范代码片段用来验证整个流程是否通畅无阻: ```vbnet Imports System.Runtime.InteropServices ' 引入必要的名称空间以启用互操作特性 <ComVisible(True)> Public Class SampleClass Public Function GetMessage() As String Return "This message comes from a VB.Net assembly." End Function End Class ``` 之后再回到 Pyhton 方面继续编写测试脚本如下所示即可顺利完成交互过程[^1]: ```python import clr # 假设 dll 名称为 MyVBDll.dll ,并且位于当前目录下 clr.AddReference('MyVBDll') from MyVBDll import SampleClass obj = SampleClass() print(obj.GetMessage()) ``` --- ### 总结 综上所述,借助于专门设计好的桥梁型解决方案即能轻松达成跨平台间无缝衔接的目的。无论是采用哪种具体的编程语言形式作为起点终点都无所谓重要之处在于找到合适的中间媒介充当沟通纽带角色而已!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值