python 模块会导入几回?猴子补丁为何能够实现?

一共三个文件python

a.py内容是函数

print('被导入')spa

x = 1对象

 

b.py内容是import

import a变量

a.x = 2引用

 

c.py内容是方法

import aim

import bimg

print(a.x)

 

如今运行c文件,这个结果出乎不少人的意料大部分python人员都猜不对,结果是

 在c文件里面无论是先导入a仍是先导入b,

一、能够发现a模块被两个地方导入了,可是只打印一次 “被导入”。

二、打印x的结果都是2。

不光是本身的文件如此,导入库文件也是同样。因此这就是猴子补丁能实现的缘由。

 

二、再多想一下,为何要面向对象了,不面向对象,直接模块加全局变量,会形成多个地方全局变量互相干扰。有了类,类自然就是多实例,类的全部实例就像是无数个全局变量互不干扰的复制模块。

2.1不用面向对象也能够实现多实例,原来是狗写成全局变量了,须要改为从函数return一只狗,而后有个吃翔的函数,把这个return出来的狗传给这个函数,因此形式是

eat(dog,sheet)

 

2.2用面向对象,那么就不是狗模块了,有个狗类,狗吃翔变成了

dog = Dog()  

dog.eat(sheeet)

那么多个狗就实例化屡次,每一个狗 吃了多少翔  体重变化了多少,都是彻底独立的。

 

2.1的面向过程模拟多实例,须要在类外传入和保存不少狗的属性和状态,多个函数使用同一个类型的传参,很频繁,不是很容易看懂,例如a函数的第一个参数和b函数的第一个参数是表明同一个东西好比狗的名字,有的人在a函数写dog_name,在b

函数写name,真的不容易看出来他们的关联。若是是面向对象,那是很直观的,a方法和b方法都是引用self.name。

 

扯远了从模块导入机制  到了猴子补丁 面向过程 面向对象了。

 

 

三、把b文件改为这样,name运行c会获得什么呢。

import afrom a import xx = 2由第三个例子可见,猴子补丁可不是乱打,地方打错了,就不会生效。主要是要找到你经常使用那个模块的什么函数或者类,patch与那个引用同一个模块的模块。打补丁时候必定要搞清楚from xx import yy和import xx.yy的区别,区别至关大。
相关文章
相关标签/搜索