23-剖析Python中的模块导入机制、Python是如何加载模块的
23-剖析Python中的模块导入机制、Python是如何加载模块的楔子上一篇我们介绍了生成器,本来这里应该介绍协程的,但是大致阅读了一下,感觉如果从源码的角度来介绍协程的话,工作量太大。而且个人精力有限,所以推荐我写的这一篇博客:https://www.cnblogs.com/traditional/p/11828780.html,是用来介绍asyncio的,当然也从Python的角度介绍了Python中的协程。
这一次我们说一下Python模块的加载机制,我们之前所考察的所有内容都具有一个相同的特征,那就是它们都局限在一个py文件中。然而现实中不可能只有一个py文件,而是存在多个,而多个py文件之间存在引用和交互,这些也是程序的一个重要组成部分。那么这里我们就来分析,Python中模块的导入机制。
在这里我们必须强调一点,Python中一个单独的py文件、或者pyd文件,我们称之为一个 *模块* ;而多个模块组合起来放在一个目录中,这个目录我们称之为 *包* 。
但是不管是模块,还是包,它们在Python的底层都是PyModuleObject结构体实例,类型为PyModule_Ty ...
TYPET5 SEQ2SEQ TYPE INFERENCEUSING STATIC ANALYSIS
d9eba399523fe401e434f6396d459a7a735596707e1aa1664e34b3a934e193fb0ea97727a63d29c47c16bc11780e2295230f44148d8f5776b77661d3eaacdc1edb0e7298c625afbed7de1654920dbedcaf6c183075c7c776c41098675090a2e7c3d46c9020485d05f6c0ccfd439ccb33beccc8c7f960b780329fe5815eba98239393b2b73e99e07a6493291a964c054d51c45527d7775054a4e86ab5d210e45920f2e918879e3e25f12eb79920f330cd183c2a31a2776dc246cc5c832f22f6673b02deef89369e00b064861ac42b2f59dfbbbb57b744eebb2d8aa1ccd8075a635f80772d0649f81fd60527221bce66c3a854ae89a86ad999c ...
22-Python中的生成器对象
22-Python中的生成器对象楔子下面我们来聊一聊Python中的生成器,它是我们理解后面协程的基础,生成器的话,估计大部分人在写程序的时候都想不到用。但是一旦用好了,确实能给程序带来性能上的提升,那么我们就来看一看吧。
生成器基本用法我们知道,一个函数如果它的内部出现了yield关键字,那么它就不再是普通的函数了,而是一个生成器函数。当我们调用的时候,就会创建一个生成器对象。
生成器对象一般用于处理循环结构,应用得当的话可以极大优化内存使用率。比如:我们读取一个大文件。
123456def read_file(file): return open(file, encoding="utf-8").readlines()print(read_file("假装是大文件.txt"))# ['人生は一体何だろう\n', 'たぶん 輝いている同時に\n', '人を苦しくさせるものだろう']
这个版本的函数,直接将里面的内容全部读取出来了,返回了一个列表。如果文件非常大,那么内存的开销 ...
21-Python类机制的深度解析 全方位介绍Python中的魔法方法,一网打尽
21-Python类机制的深度解析: 全方位介绍Python中的魔法方法,一网打尽楔子下面我们来看一下Python中的魔法方法,我们知道Python将操作符都抽象成了一个魔法方法(magic method),实例对象进行操作时,实际上会调用魔法方法。也正因为如此,numpy才得以很好的实现。
那么Python中常见的魔法方法都有哪些呢?我们按照特征分成了几类,下面就来看看魔法方法都有哪些,然后再举例说明它们的用法。
魔法方法概览我们根据不同的特征分为了以下几类:
注意:有的方法是Python2中的,但是在Python3中依然存在,但是不推荐使用了。比如:__cmp__、__coerce__等等,我们就没有画在图中。
下面我们就来介绍一下上面的那些魔法方法的实际用途。
魔法方法介绍构建以及初始化__new__和__init__我们之前已经见识过了,还有一个__del__是做什么 呢?我们一起来看一下。
123456789101112131415161718192021class Girl: def __new__(cls, *args): print(" ...
20-Python类机制的深度解析:实例对象的创建、以及属性访问
20-Python类机制的深度解析(第四部分): 实例对象的创建、以及属性访问楔子介绍完类对象之后,我们来介绍实例对象。我们之前费了老鼻子劲将类对象剖析了一遍,但这仅仅是万里长征的第一步。因为Python虚拟机执行时,在内存中兴风作浪的是一个个的实例对象,而类对象只是幕后英雄。
通过class类对象创建实例对象我们还以之前的代码为例:
123456789101112131415class Girl: name = "夏色祭" def __init__(self): print("__init__") def f(self): print("f") def g(self, name): self.name = name print(self.name)girl = Girl()
看一下它的字节码,这里我们只看创建实例对象的字节码,也就是模块的字节码。
12345678910111213 1 0 LOAD_BUILD_CLASS ...
Where to Start Studying Type Annotation Practices in Python
d9eba399523fe401e434f6396d459a7a735596707e1aa1664e34b3a934e193fbc64ced270df111e45ce10c71ebeb328a3c7da65366e3cb991bae8994ae8d02c0d0f157b414f94a74e8880e7b81a74aac3b82cc18f2553f7f3b469daa473363a66a53bf10d55b5b34185a7194d836b7b0c8e6e176fd874d3712341b7148dd726bfe4f54f455ba6d1076ed33f0d8bd68d749bb2f435d30152c001491107f80c8f0d1940222deb4fdbf6c2f938898660fa46d7a7df48ef22e6ff3757786c164378371b99c442b375fa34f49ad57faf7d9d98ad032ffd6ca4d157fb0c122655c5ed51bffa6a2c506b7adc2e8e300b7213a4db74a51c462b0e51e8 ...
Static Type Inference for Foreign Functions of Python
d9eba399523fe401e434f6396d459a7a735596707e1aa1664e34b3a934e193fb13421448a5d79f3403a0b188d7e84076afa8b7ac4c55d8a318940870533929874de96ccbbec1b9b79b8c66ea7ccbad221a1a61d8eb521ff0ed356f4e0addd94c07c7a1114175bab5ac67c40e196961ad16b22328f6ce80f87c22e04ace8f051e137491da6b494a4712628c906ad76521c7194aa302a7a1574370e3b86654842b012e5f4ca9751cf985d00efd6fe4431d8aa70453e965dfecc17b20b88addad448d9cbb07589ff9c8d03574613838c6df17aa195ebae62e070124bbde14a001763ac9fda77b2331a4de6bced5f4a58b6f4580e53439d8b18ea ...
What the Fork Finding Hidden Code Clones in npm
d9eba399523fe401e434f6396d459a7a735596707e1aa1664e34b3a934e193fb5148402a397e2d2b625f9857147c1a10ab4ed15488bff296aae09ef4040afa37bacd23f9bfe8f9679b506d15e85f61626eb318498197801eb02c54320e921746b585b06839bf6875de0bb56e0c94b3df22c3a3b4468bcbc68dbfee0474289f56d5f807039a737454e0d880ad8e50655a8c5e249fe240b4be1c14d275aa955afef2ebc90c255ead2f8265d620dd45ad1ebe5eb4f3a0a5fd1486f598ac20bc850eb5cd8ef667fe01d50c9ca8c9a118ee1d92e6e46cf870d0e2594f8a383fc41d2c1e56ca445adf306eed77fd4144d029975d3e5a7e401b5c2cb ...
19-Python类机制深度解析:自定义类的底层实现以及Metaclass
19-Python类机制深度解析:自定义类的底层实现以及metaclass楔子Python除了给我提供了很多的类之外,还支持我们定义属于自己的类,那么Python底层是如何做的呢?我们下面就来看看。
自定义class老规矩,如果想知道底层是怎么做的,那么就必须要通过观察字节码来实现。
12345678910111213141516171819202122class Girl: name = "夏色祭" def __init__(self): print("__init__") def f(self): print("f") def g(self, name): self.name = name print(self.name)girl = Girl()girl.f()girl.g("神乐mea")"""__init__f神乐mea"""
通过之前对函数机制的分析中,我 ...
18-Python类机制深度解析-类的多继承与属性查找
18-Python类机制深度解析-类的多继承与属性查找楔子这次我们来看一下Python中类的继承与属性查找机制,我们说Python是支持类的多继承的,在查找属性的时候会沿着继承链不断找下去。那么下面我们就来深入地考察一下类的继承与属性查找在底层是如何实现的。
深入class我们知道Python里面有很多以双下划线开头、双下划线结尾的方法,我们称之为魔法方法。Python中的每一个操作符,都被抽象成了一个魔法方法。比如整数3,整数可以相减,这就代表int这个类里面肯定定义了__sub__函数。字符串不能相减,代表str这个类里面没有__sub__函数;而整数和字符串都可以执行加法操作,显然int、str内部都定义了__add__函数。
123456789class MyInt(int): def __sub__(self, other): return int.__sub__(self, other) * 3a = MyInt(4)b = MyInt(1)print(a - b) # 9
我们自己实现了一个类,继承自int。当我执行a - b的时候,肯定执行对应 ...