python 模块会导入几次?猴子补丁为什么可以实现?
一共三个文件
a.py内容是
print('被导入')
x = 1
b.py内容是
import a
a.x = 2
c.py内容是
import a
import b
print(a.x)
现在运行c文件,这个结果出乎很多人的意料大部分python人员都猜不对,结果是

在c文件里面不管是先导入a还是先导入b,
1、可以发现a模块被两个地方导入了,但是只打印一次 “被导入”。
2、打印x的结果都是2。
不光是自己的文件如此,导入库文件也是一样。所以这就是猴子补丁能实现的原因。
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。
扯远了从模块导入机制 到了猴子补丁 面向过程 面向对象了。
3、把b文件改成这样,name运行c会得到什么呢。
import a
from a import x
x = 2 由第三个例子可见,猴子补丁可不是乱打,地方打错了,就不会生效。主要是要找到你常用那个模块的什么函数或者类,patch与那个引用同一个模块的模块。打补丁时候一定要搞清楚from xx import yy和import xx.yy的区别,区别相当大。
python 模块会导入几次?猴子补丁为什么可以实现?的更多相关文章
- Python 中的鸭子类型和猴子补丁
原文链接: Python 中的鸭子类型和猴子补丁 大家好,我是老王. Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这 ...
- 11、python模块的导入
前言:本文主要介绍python模块的导入,包括模块的定义.模块的作用.导入方式以及模块的搜索路径. 一.模块的定义 python模块(module),简单来说就是一个python文件,以.py结尾,文 ...
- 6.python模块(导入,内置,自定义,开源)
一.模块 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过 ...
- python模块以及导入出现ImportError: No module named 'xxx'问题
python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...
- 浅谈python模块的导入操作
1.什么是模块 在Python中有一个概念叫做模块(module). 所谓模块,就是将代码量较大的程序分割成多个有组织的,彼此独立但双能互相交互的代码片段, 这些自我包含的有组织的代码段就是模块. 2 ...
- Python模块的导入以及软件开发规范
Python文件的两种用途 1 . 当脚本直接使用,直接当脚本运行调用即可 def func(): print("from func1") func() 2 . 当做模块被导入使用 ...
- Python——模块以及导入注意事项
在Python中,每一个文件都应该是可以被导入的. 每一个独立的python文件都是一个模块 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍. 而在实际应用时,每个模块都是有专人负责独立开发 ...
- Python模块及其导入
一.模块 1.模块的定义: 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少, 很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件 ...
- dive into python:模块的导入和搜索文件路径的配置
1.Python中导入模块:import sys:相当于Java中的导入包.类. 比如,我们导入sys模块,使用:import sys; 2.Python中调用函数的时候,会从默认配置的库文件夹中(s ...
随机推荐
- JavaScript原型之路
简介 最近我在学习Frontend Masters 上的高级JavaScript系列教程,Kyle 带来了他的“OLOO”(对象链接其他对象)概念.这让我想起了Keith Peters 几年前发表的一 ...
- python 字符串的一些方法
总结:# split 分割 ********# strip 脱 默认脱头尾的空格 ********# replace 替换 ********# join 插入 拼接 ********# format ...
- win2008R2管理员密码修改文档
场景:忘记了win2008R2服务器的管理员密码.解决办法:1. 制作一个U盘启动盘:2. 系统通过U盘启动进入WINpe系统3. 在知道Win2008安装位置的情况下:查找C:\windows\sy ...
- php中call_user_func 与 call_user_func_array的使用
call_user_func()是利用回调函数处理字符串,call_user_func_array是利用回调函数处理数组. // 1. 调用自定义函数 function test($a, $b) { ...
- JPA查询单个字段和多个字段返回类型总结
原文地址:https://blog.csdn.net/weixin_40326509/article/details/80865646 在使用springboot中,需要使用JPQL和SQL去查询记录 ...
- 服务 Service 简单案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Openstack配置文件管理的变迁之路
在管理一个Openstack集群时,如何维护配置文件无疑是其中最艰难和繁琐的任务之一.因为你不仅要面对众多的核心服务(nova,keystone,glance,cinder,etc)的配置文件,还需要 ...
- 权威公布:彻底搞清楚哪些笔记本和台式机主板能够支持42mm SATA M.2 NGFF(2242)接口的固态硬盘!!!
在京东,天猫上搜寻半天.致电联想客服以及各个固态盘的店小二.都搞不清楚兼容性问题.并且联想客服的回答明显错误,官网描写叙述也错误,客服project师也含糊不清说:要拆机试一试才知道是否兼容. 我就不 ...
- MySQL5.7多主一从(多源复制)同步配置
MySQL5.7多主一从(多源复制)同步配置(抄袭) 原文地址:https://my.oschina.net/u/2399373/blog/2878650 多主一从,也称为多源复制,数据流向: 主库1 ...
- 【PMP】项目、项目集、项目组合
项目:为创建独特的产品和服务成果而进行的临时性工作. 项目集:是一组相互关联且被协调管理的项目.子项目集和项目活动,以便获得分别管理所无法获得的利益. 项目组合:是指实现战略目标而组合在一起管理的项目 ...