一共三个文件

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 模块会导入几次?猴子补丁为什么可以实现?的更多相关文章

  1. Python 中的鸭子类型和猴子补丁

    原文链接: Python 中的鸭子类型和猴子补丁 大家好,我是老王. Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这 ...

  2. 11、python模块的导入

    前言:本文主要介绍python模块的导入,包括模块的定义.模块的作用.导入方式以及模块的搜索路径. 一.模块的定义 python模块(module),简单来说就是一个python文件,以.py结尾,文 ...

  3. 6.python模块(导入,内置,自定义,开源)

    一.模块 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过 ...

  4. python模块以及导入出现ImportError: No module named 'xxx'问题

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...

  5. 浅谈python模块的导入操作

    1.什么是模块 在Python中有一个概念叫做模块(module). 所谓模块,就是将代码量较大的程序分割成多个有组织的,彼此独立但双能互相交互的代码片段, 这些自我包含的有组织的代码段就是模块. 2 ...

  6. Python模块的导入以及软件开发规范

    Python文件的两种用途 1 . 当脚本直接使用,直接当脚本运行调用即可 def func(): print("from func1") func() 2 . 当做模块被导入使用 ...

  7. Python——模块以及导入注意事项

    在Python中,每一个文件都应该是可以被导入的. 每一个独立的python文件都是一个模块 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍. 而在实际应用时,每个模块都是有专人负责独立开发 ...

  8. Python模块及其导入

    一.模块 1.模块的定义: 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少, 很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件 ...

  9. dive into python:模块的导入和搜索文件路径的配置

    1.Python中导入模块:import sys:相当于Java中的导入包.类. 比如,我们导入sys模块,使用:import sys; 2.Python中调用函数的时候,会从默认配置的库文件夹中(s ...

随机推荐

  1. tomcat溢出

    http://blog.csdn.net/qq_15653597/article/details/42753269?locationNum=10

  2. Profiling Java Application with Systemtap

    https://laurent-leturgez.com/2017/12/22/profiling-java-application-with-systemtap/ https://myaut.git ...

  3. Geek地生活,文艺地思考

    本文纯属整理自己零碎杂乱的思绪,和题目无关.           不知觉间,大学已经两年过去了,忙忙碌碌了两年,大一那年參加了学生会编 辑部和艺术团舞蹈队,课余时间的生活总是被舞蹈队排练.參演和编辑部 ...

  4. AndroidStudio下加入百度地图的使用 (三)——API基本方法及常量属性

    上一章中我们已经完成定位功能,这一章向大家介绍一下常用的方法及常量属性的意思. (1) 手势方法 缩放: setZoomGesturesEnabled() 俯视: setOverlookingGest ...

  5. [Java] Hashtable 源码简要分析

    Hashtable /HashMap / LinkedHashMap 概述 * Hashtable比较早,是线程安全的哈希映射表.内部采用Entry[]数组,每个Entry均可作为链表的头,用来解决冲 ...

  6. 问题解决java.lang.IllegalArgumentException at org.springframework.asm.ClassReader

    手上拿到一个老的项目,使用的是spring3.2,启动的时候报错了: 查了一下,发现spring3.2不兼容jdk8,只能使用jdk8以下的版本,使用jdk6可以启动,但是maven构建的时候又提示不 ...

  7. windows多线程--原子操作

    推荐参考博客:秒杀多线程第三篇 原子操作 Interlocked系列函数 原子操作 VS 非原子操作 原子操作就是不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程切 ...

  8. [Python]编码声明:是coding:utf-8还是coding=urf-8呢

    推荐: #!/usr/bin/env python3 # -*- coding: utf-8 -*- 我们知道在Python源码的头文件中要声明编码方式,如果你不只是会用到ascii码,很多人都写得都 ...

  9. iOS 测试版系统安装说明(粗略翻译)

    我们常常看到在https://developer.apple.com/download/这里会有beta版本的ios系统 或者开发软件 关于beta版本的应用,其实有很大用处,好多人会在正式版没有发布 ...

  10. Adobe Photoshop for Mac(图像处理软件)破解版安装

    1.软件简介    Adobe Photoshop(简称 "PS")是 macOS 系统上一款由 Adobe Systems 开发和发行的图像处理软件.Photoshop 主要处理 ...