python 模块会导入几次?猴子补丁为什么可以实现?

一共三个文件

a.py内容是

print(‘被导入‘)

x = 1

b.py内容是

import a

a.x = 2

c.py内容是

import a

import b

print(a.x)

现在运行c文件,这个结果出乎很多人的意料大部分python人员都猜不对,结果是

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

2、在c文件里面不管是先导入a还是导入b,打印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。

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

原文地址:https://www.cnblogs.com/ydf0509/p/9366062.html

时间: 2024-11-05 18:50:57

python 模块会导入几次?猴子补丁为什么可以实现?的相关文章

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

python模块以及导入出现ImportError: No module named 'xxx'问题 python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模 块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用 如果你要使用的模块(py文件)和当前模块在同一目录,只要import相应的文件名就好,比 如在a.py中使用b.py:  import b 但是如果要import一个不同目录的文件(例如b.py)该怎么做

python模块以及导入出现ImportError: No module named ‘xxx’问题

首先来说,这个问题是我用pycharm4.5进行开发的,我在做python的模块与函数单元的例子. 需要建一个模块名字叫myModule 于是我就写了一个,挺简单的 def arithmetic(x=1, y=1, operator="+"): result={ "+":x+y, "-":x-y, "*":x*y, "/":x/y } return result.get(operator) class My

11、python模块的导入

前言:本文主要介绍python模块的导入,包括模块的定义.模块的作用.导入方式以及模块的搜索路径. 一.模块的定义 python模块(module),简单来说就是一个python文件,以.py结尾,文件内容包含了python对象定义和python语句 二.模块的作用 模块可以让你能够有逻辑地组织Python代码段 把相关的功能代码写到到一个模块里能让你的代码更好用,更清晰易懂 模块能定义函数,类和变量,模块里也能包含可执行的代码 三.模块的导入方式 1.直接导入模块或导入模块的某个对象: imp

python模块的导入以及模块简介

一.模块的定义及类型 1.定义 模块就是用一堆的代码实现了一些功能的代码的集合,通常一个或者多个函数写在一个.py文件里,而如果有些功能实现起来很复杂,那么就需要创建n个.py文件,这n个.py文件的集合就是模块 2.类型 1)自定义模块,自己写的实现自己某些功能需求的.py文件集合 2)导入的模块 在你安装python之后,它自己内部的lib文件下就有很多模块可以用,导入后就可以使用,通常路径是C:\Python27\Lib   (27是版本号,如果是3.5的版本就是C:\Python35\L

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

1.Python中导入模块:import sys:相当于Java中的导入包.类. 比如,我们导入sys模块,使用:import sys; 2.Python中调用函数的时候,会从默认配置的库文件夹中(sys.path)搜索你所调用的模块.这个库文件的目录配置,如下: sys.path用来配置Python模块搜索路径.它是一个List(列表),打印默认sys.path的内容: Python 3.3.5 (v3.3.5:62cf4e77f785, Mar  9 2014, 10:37:12) [MSC

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

一.模块 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块. 2.模块的引入 在Python中用关键字import来引入某个模块,比如要引用模

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

在Python中,每一个文件都应该是可以被导入的. 每一个独立的python文件都是一个模块 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍. 而在实际应用时,每个模块都是有专人负责独立开发的,通常模块会有测试代码,这些测试代码仅在模块内部使用,被导入到其他文件中不需要执行时,我们可以用内置__name__属性来判断,因为__name__测试模块中的代码只有在测试模块下才被运行,被导入时不会执行. 如果一个文件是被其他文件所导入的,那么输出__name__就是模块名 如果是当前执行的程

python模块的导入详解

一:一个小问题:什么是模块? 我的理解是:有通用功能的文件的集合. 二:为什么要使用模块? 我们通常为了使自己以前写的东西保存下来,会把东西写入文件中保存下来,必要时我们把这些文件当脚本去执行,也可以把他们当做模块导入其他的模块中,实现了功能的存放利用. 三:怎样导入自己的模块? 自定义demo模块: print('in demo.py')money=100def read(): print('in read',money)print(__name__) '''import demodef re

python 模块的导入和使用

来看一看python的模块导入和是用 [[email protected] dist-packages]# cat indentation.py #!/usr/bin/enb python version = 'v1.0' author = 'Madon' def sayHi (n):   print 'hi , this is a module.',n //这里说明一下,我写的这个模块.2-3行使用的变量,用户调用version和author输出对应内容. //第四行使用sayHi 加用户输入