进击の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()

这个方法里面会添加两个参数

一个是函数名,另一个没什么用,暂时不用记

里面写的是个字符串类型的

当然这个是调用本路径的

要是调用别的路径的就是

文件名.方法


*有点东西*
*继续深究*

~~面向对象进阶——__name__=="__main__"~~的更多相关文章

  1. python进阶(7):面向对象进阶

    学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass class Foo: pass class Son( ...

  2. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  3. Python面向对象进阶和socket网络编程-day08

    写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...

  4. python_面向对象进阶(7)

    第1章 面向对象特性—继承(补充) 1.1 接口类.抽象类介绍 1.2 接口类 1.3 接口类应用过程 1.3.1 第一版:完成多种支付方式接口 1.3.2 第二版: 归一化设计,统一支付方式 1.3 ...

  5. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...

  6. python进阶_浅谈面向对象进阶

    python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass  class F ...

  7. Python学习之面向对象进阶

    面向对象进阶当然是要谈谈面向对象的三大特性:封装.继承.多态 @property装饰器 python虽然不建议把属性和方法都设为私有的,但是完全暴露给外界也不好,这样,我们给属性赋值的有效性九无法保证 ...

  8. day26、面向对象进阶:多态、封装、反射

    一.多态 什么是多态: 类的继承有两层意义:1.改变 2.扩展 多态就是类的这两层意义的一个具体的实现机. 即:调用不同类实例化的对象,下的相同的方法,实现的过程不一样 python中的标准类型就是多 ...

  9. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

随机推荐

  1. orm多表操作

    一.创建表 1.一对多 必须在"多"的表中创建关联字段,在外加约束 class Book(models.Model): id=models.AotuField(primary_ke ...

  2. java中的String、StringBuffer、StringBuilder的区别

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  3. Java动态规划

    1. 介绍 动态规划典型的被用于优化递归算法,因为它们倾向于以指数的方式进行扩展.动态规划主要思想是将复杂问题(带有许多递归调用)分解为更小的子问题,然后将它们保存到内存中,这样我们就不必在每次使用它 ...

  4. webstrom sass 关于arguments 和 Output paths to refresh 设置

    第一种设置: Arguments:--no-cache --update -t expanded $FileName$:$FileNameWithoutExtension$.css Output pa ...

  5. 18 HTML标签以及属性全

    基本结构标签: <HTML>,表示该文件为HTML文件 <HEAD>,包含文件的标题,使用的脚本,样式定义等 <TITLE>---</TITLE>,包含 ...

  6. Mybatis_three

    延迟加载 实现多对一的延迟加载(association) 例如下面的:有很多个账户信息(招商\工商\农商)是属于一个用户人的 [需求] 查询账户(Account)信息并且关联查询用户(User)信息. ...

  7. Scala 学习之路(十一)—— 模式匹配

    一.模式匹配 Scala支持模式匹配机制,可以代替swith语句.执行类型检查.以及支持析构表达式等. 1.1 更好的swith Scala不支持swith,可以使用模式匹配match...case语 ...

  8. JavaWeb入门_模仿天猫整站Tmall_JavaEE实践项目

    Tmall_JavaEE 技术栈 Servlet + Jsp + Tomcat , 是Java Web入门非常好的练手项目 效果展示: 模仿天猫前台 模仿天猫后台 项目简介 关联项目 github - ...

  9. Android 上传开源项目到 jcenter 实战踩坑之路

    本文微信公众号「AndroidTraveler」首发. 背景 其实 Android 上传开源项目到 jcenter 并不是一件新鲜事,网上也有很多文章. 包括我本人在将开源项目上传到 jcenter ...

  10. KVM虚拟机迁移至VMware

    1.将kvm下虚拟机关机: [root@localhost ~]# virsh list --all Id Name State ----------------------------------- ...