if __name__ == ‘__main__’: 究竟起什么作用?
一、if __name__ == ‘__main__’: 究竟起什么作用

一个python文件通常有两种使用方法,名列前茅是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if __name__ == ‘__main__’: 的作用就是控制这两种情况执行代码的过程,在 if __name__ == ‘__main__’: 下的代码只有在名列前茅种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。
作为脚本直接执行:
假设我们有个叫做 demo.py 的 Python 文件,其中包含了一些函数定义和变量声明。在 demo.py 文件末尾加入如下代码:
if __name__ == '__main__': print('这个文件正在被直接执行!')当我们在命令行中输入 python demo.py 并运行时,会输出”这个文件正在被直接执行!”。
作为模块导入:
假设我们有另一个叫做 test.py 的 Python 文件,想要调用 demo.py 中的某些函数。在 test.py 中导入 demo.py,并调用其中的函数:
import demoresult = demo.add(1, 2)print(result)如果 demo.py 不包含 if __name__ == ‘__main__’ 语句,当我们运行 test.py 时会先输出”这个文件正在被直接执行!”,然后才输出 add 函数的调用结果,这并不是我们所期望的。而如果在 demo.py 中加入 if __name__ == ‘__main__’ 语句,它只会在 demo.py 直接被执行时输出”这个文件正在被直接执行!” ,当 demo.py 被 test.py 导入时则不会输出。这样可以避免在调用模块时不必要的代码重复执行,使代码更加简洁和高效。
二、python中其他的特殊变量
除了 __name__ 之外,Python 中还有一些类似的特殊变量,它们也以双下划线开头和结尾。以下是一些比较常用的类似的特殊变量:
1、__all__
python模块中的__all__,可用于模块导入时限制,如:
from module import *此时被导入模块若定义了__all__属性,则只有__all__内指定的属性、方法、类可被导入。若没定义,则导入模块内的所有公有属性,方法和类。
在别的模块中,导入该模块时,只能导入__all__中的变量,方法和类:
__all__ = ('A', 'func') class A(): def __init__(self, name, age): self.name = name self.age = age class B(): def __init__(self, name, id): self.name = name self.id = id def func(): print('func() is called!') def func1(): print('func1() is called!')test.py中定义了__all__属性,只能导入__all__中定义的属性,方法和类:
from test import * a=A('python','24') print(a.name,a.age) func() #func1() #NameError: name 'func1' is not defined #b=B('python',123456) #NameError: name 'B' is not defined 2、__slots__
Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性范围:
class P(object): __slots__ = ("name", "age") pass3、__init__()
构造函数,创建实例的时候,可以调用init方法做一些初始化的工作,如果子类重写了init,实例化子类时,则只会调用子类的init,此时如果想使用父类的init,可以使用super函数,如下:
class P(object): def __init__(self, name, score): self.name = name self.score = name class C(P): def __init__(self, name, score, age): super(C, self).__init__(name, score) self.age = age4、__new__()
注意:__init__是实例创建之后调用的名列前茅个方法,而__new__更像构造函数,它在__init__之前被调用。另外,__new__方法是一个静态方法,名列前茅参数是cls,__new__方法必须返回创建出来的实例。
例如,用__new__实现单例模式:
class Singleton(object): def __new__(cls): # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象 if not hasattr(cls, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance obj1 = Singleton()obj2 = Singleton() obj1.attr1 = 'value1'print(obj1.attr1, obj2.attr1)print(obj1 is obj2)5、__repr__()
是给机器用的,在Python解释器里面直接敲对象名在回车后调用的方法。(用于调试)
# test.pyclass P(object): def __str__(self): return "__str__ called" def __repr__(self): return "__repr__ called" p = P()__str__和__repr__的区别:
>>> from test import p>>> p__repr__ called>>> print p__str__ called6、__exit__
这两个方法是用于支持with语句的上下文管理器。例如让文件句柄支持with语法的实现:
class File(object): def __init__(self, file_name, method): self.file_obj = open(file_name, method) def __enter__(self): return self.file_obj def __exit__(self, type, value, traceback): self.file_obj.close() with File('demo.txt', 'w') as opened_file: opened_file.write('Hola!')延伸阅读1:python的内置函数有哪些
类型转换函数:int()、float()、str()、bool()、list()、tuple()、set()、dict()、bytes()、bytearray()、memoryview()等。数字运算函数:abs()、round()、pow()、min()、max()等。列表和元组操作函数:len()、sorted()、reversed()、sum()、zip()、enumerate()、map()、filter()等。字符串操作函数:strip()、split()、join()、replace()、format()、find()、index()等。文件和目录操作函数:open()、read()、write()、close()、os.mkdir()、os.path.join()等。其他函数:print()、input()、range()、dir()、type()、id()、help()、isinstance()、callable()等。
猜你喜欢LIKE
相关推荐HOT
更多>>
数据库ER图是怎么做的?
一、数据库ER图的制作步骤1、确定实体首先,确定数据库中的实体,即表示现实世界中独立存在的对象或概念。例如,如果我们正在设计一个学生管理...详情>>
2023-10-17 22:22:23
数据库事务原子性、一致性是怎样实现的?
一、数据库事务原子性、一致性的实现方式数据库事务的原子性(Atomicity)和一致性(Consistency)是通过事务的 ACID 特性来实现的。原子性(At...详情>>
2023-10-17 20:24:58
PolarDB-X与PolarDB的关键区别是什么?
一、PolarDB-X与PolarDB的关键区别PolarDB实际是共享存储型的数据库,适合于公有云场景降低中小型租户成本的数据库,类似于AWS的AURORA,类似于...详情>>
2023-10-17 17:43:25
SQL语句为什么使用select * 会降低查询速度?
一、为什么使用select * 会降低查询速度在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。说明:增加查询分析器解析...详情>>
2023-10-17 15:31:17热门推荐
设计数据库时,数据库名和表名是否需要前缀,优缺点是什么?
沸什么是分库分表?
热数据库ER图是怎么做的?
热时序数据库是什么?
新用什么工具做局域网报表填报系统?
数据库事务原子性、一致性是怎样实现的?
作为一个K-V数据库,levelDB索引为什么要使用LSM树实现,而不采用哈希索引?
既然MySQL中InnoDB使用MVCC,为什么REPEATABLE-READ不能消除幻读?
为什么要用模块化、组件化才能完成 Android 项目中类加载功能?
PolarDB-X与PolarDB的关键区别是什么?
怎样在MySQL表中存储树形结构数据?
redis似乎并没有“事务”,那些用到“事务”的人在做什么?
开发一款商城系统APP有什么优势?
SQL语句为什么使用select * 会降低查询速度?
技术干货
京公网安备 11010802030320号