Python模块导入与__name__变量的使用

news/2024/7/3 20:27:10

    我有以下三个python文件:


在python中每一个py文件都是一个模块,不管里面写了什么。

现在main.py调用test1模块,那么导入的方式可以是:

  1. import test1导入test1包,在使用其中的类或者方法时,需要指定,如:test1.test()
  2. from test1 import *  导入test1模块所有的内容,在main中可以直接test()
  3. from test1 import test 只导入test1模块中的test方法或者类
  4. import test1 as tt 表示test1的别名,在main中使用时不能test1.test(),而是tt.test()
  5. from test1 import test,test1 导入多个方法

test1和main两个文件的内容分别是:

test1.py

def test():
        print('this is test1 test')

def test1():
        print('this is test1 test1')
test()

main.py

import test1

test1.test()

此时执行main.py


这样就导入了test1.py模块了。

假如我为了在test1.py中测试test函数,代码如下:

def test():
        print('this is test1 test')

def test1():
        print('this is test1 test1')
test()

再去执行main.py,看到结果:


出现了两条打印记录,换句话说就是test函数被执行了两次,这里的原因是当一个模块被导入时,实际上是执行了这个模块一次:


那么为了测试如何避免这种情况,在执行main时只打印一条数据呢,此时就用到"__name__"这个特殊变量了。

这个变量在本文件中值为“__main__”,如果被导入到别的模块中时,那么这个值就变成了这个模块的名字了,如:

def test():
        print('this is test1 test')

def test1():
        print('this is test1 test1')

test()
print('__name__ : %s'%(__name__))

输出为:


此时再执行main,py


显而易见,值已经不一样了,那么通过这个特性只要修改test1.py如下代码就可以:

def test():
        print('this is test1 test')

def test1():
        print('this is test1 test1')

if __name__ == '__main__':
        test()

再次执行main.py:


问题就解决了。

需要注意的是当导入方式为“*”时,如果存在同名的函数或者方法,那么最后一个导入的会覆盖前面的,test2.py也有函数

test,

def test():
        print('this is test2 test')

main.py修改如下:

from test1 import *
from test2 import *

test()

执行如下:


所以需要注意。





http://www.niftyadmin.cn/n/2015596.html

相关文章

uboot中MAC网络(待续)

start ->start_armboot ->main_loop 实际应用中问题:为什么从nandflash读出的MAC(写到物理phy上)与上层网口地址不同(上层网口采用env的mac)? 从nandflash读出mac并写入phy后,才初始化网络…

微型项目实践(12):查询与显示

上一篇中,我们分析了页面中的控件和数据绑定中的扩展方法,今天我们看数据的查询和显示。其中,数据的查询属于业务逻辑层(Business),而显示属于UI层。 假设我们要根据以下两个条件进行查询: 日志…

Python 核心编程(第二版)——文件和输入输出

1.文件对象 文件对象不仅可以用来访问普通的磁盘文件, 而且也可以访问任何其它类型抽象层面上的"文件". 一旦设置了合适的"钩子", 你就可以访问具有文件类型接口的其它对象, 就好像访问的是普通文件一样。文件只是连续的字节序列. 数据的传输经常会用到字节…

使用 Nim 语言和使用 C 语言, 调用系统 POSIX 接口传递文件描述符的对比

进程组之间传递文件描述符, 是多进程服务器共享套接字常用的方式. 基于此方式, 可以提供 round-robin , 使每个服务器获得平衡的负载. Nim 和 C 语言调用相同的 POSIX 接口的编程方式如下, (事实上, Nim 是调用的 C POSIX 接口) Nim import posixproc CMSG_LEN(length: cuint)…

Python模块导入时全局变量__all__的作用

Python中一个py文件就是一个模块,“__all__”变量是一个特殊的变量,可以在py文件中,也可以在包的__init__.py中出现。 1、在普通模块中使用时,表示一个模块中允许哪些属性可以被导入到别的模块中,如:全局变…

准备充分了嘛就想学函数式编程?(Part 2)

本文讲的是准备充分了嘛就想学函数式编程?(Part 2),想要理解函数式编程,第一步总是最重要,也是最困难的。但是只要有了正确的思维,其实也不是太难。 之前的部分: 第一部分 友情提示 请读仔细读代码,确保继续…

Python浅拷贝和深拷贝的思考

简而言之,浅拷贝就是只是复制了引用,并没有复制引用指向地址的内容,可以看做是同一个对象,使用is操作符时返回true,而深拷贝刚好相反,不管变量或者对象包含多少其他的引用都原模原样复制一份,即…

Mysql创建多列唯一索引Sql

ALTER TABLE t_city_combo ADD UNIQUE INDEX t_city_combo_index (combo_id, combo_name, city_id) USING BTREE 语法 ALTER TABLE 表名英文 ADD UNIQUE INDEX 索引名英文 (列1英文, 列2英文, 列3) USING BTREE Navicat 创建索引,需要如下步骤 在表右键-->设计…