进击のpython
面向对象进阶——__name__=="__main__"
前面我们在讲模块的时候,其实还有一个知识点没有很好的讲
那就是main和name
可能你们在看一些代码的时候或多或少的都会见到下面的这串代码
if __name__ == '__main__':
func()
但是百思不得其解,这行代码到底是什么意思呢?
问题的解决都是一点一点来的
我们先打印这个__name__
看看是啥!
__main__
可以看到打印出来的就是__main__
熬,那就是说这个代码是恒成立的
那我要这个代码有什么用呢?
还记得我们在说模块的时候说过
一个py文件就可以看作是一个模块是吧
那我这个文件是不是可以叫做模块啊
是不是可以被新的文件调用啊
那我们简单的丰富一下这个文件里面的代码
print("这是在if上面的语句")
print(__main__)
if __name__ == '__main__':
print("这是在if下面的语句")
我们现在先在这个文件下运行,查看一下结果
这是在if上面的语句
__main__
这是在if下面的语句
然后我们把这个文件(fesa.py)当作模块
在别的文件下进行调用
结果如下:
这是在if上面的语句
fesa
我们可以看到,这个结果是不一样的
__name__的打印结果变成了模块的名字
而且,在if下面的语句也没有被执行
其实也很能理解,因为__name__变了
就不再等于__main__了
没有满足条件,当然就不会执行if下面的语句啦
其实,我们在面向对象的时候知道
self其实是实例本身对吧
那么__main__就可以理解成模块本身
(只能这么理解,但是实际不是这样的)
我们学过sys模块
我们可以用sys模块来简单的展示一下
import sys
for k, v in sys.modules.items():
print(k, v)
打印出来的结果有,但是你能在这么多的打印数据当中找到
__main__ <module '__main__' from 'D:/xiangmu/asdfg.py'>
看到了吗?
这个__main__的值,其实就是这个模块本身
所以总结一下:
- 在自己的py文件里执行的时候,这句代码其实没有什么用,正常的执行
- 在被当成模块调用的时候,只执行这句话上面的代码
但是这玩仍有什么用呢?
其实除了上面的作用以外
还有别的操作!
我要是想导入一个模块
是不是这么写
import time
我要是把time写成字符串是不是不行
那我要是想根据用户的输入来导入模块怎么写呢?
那要是用户输入,是不是输入的就是一个字符串?
直接写肯定是不行的
在解释器里给我们提供了这种方法
__import__("time")
但是像这种魔法方法啊
一般是不推荐使用的
所以除了这种方法,我们还有另一个方法
python官方给我们推荐了另一种方法
import importlib
importlib.import_module()
这个方法里面会添加两个参数
一个是函数名,另一个没什么用,暂时不用记
里面写的是个字符串类型的
当然这个是调用本路径的
要是调用别的路径的就是
文件名.方法