0、__name__是什么
Python 为模块、类、函数等自动声明了一个__name__属性(变量),用于标识模块、类、函数等的名称。对于类和函数而言,__name__的值总是与类和函数的名称一致。
而对于模块,__name__会因为模块的加载方式的不同而不同,当一个文件被直接运行时,__name__的值就是__main__;而当文件被import,即被当模块使用时,__name__的值则是模块的路径,在我们的例子中,值与 import后面的内容相同。
为了展示__name__的内容,我们直接来看一个例子。程序的目录结构如下:测序程序的目录结果
这个例子中,a.py是程序的入口,也就是通过运算python3 a.py来启动程序。a.py中引用了b.py, c.d.py。各个文件的代码如下:
# a.py
import b
import c.d
def fa(): pass
print("name of a.py:", __name__)
if __name__ == "__main__":
print("__main__ print from a.py")
print("name of fa:", fa.__name__)
print("name of class B:", b.B.__name__)
print("name of class D:", c.d.D.__name__)
# b.py
print("name of b.py:", __name__)
class B: pass
if __name__ == "__main__":
print("__main__ print from b.py")
# d.py
print("name of d.py:", __name__)
class D: pass
if __name__ == "__main__":
print("__main__ print from d.py")
程序的运行结果如下:
name of b.py: b
name of d.py: c.d
name of a.py: __main__
__main__ print from a.py
name of fa: fa
name of class B: B
name of class D: D
1、模块的__name__变量怎么用
为了方便表述,我们将if __name__ == “__main__”条件语句下的代码称为main块。
如第0节所展示的,在一个程序中,Python在首次运行import x时,会运行x中的所有代码。当一个python文件在直接运行或者被import使用时,如果行为有所不同,此时__name__就显得非常重要。从上面的例子的运行结果可以看出,只有a.py的main块下面的代码会被运行。
当我们在编写一个模块的时候,一个好的习惯是为每个模块编写一个测试代码,用于展示模块各功能的用法,或者用于测试模块的功能。 测试代码可以在模块直接运行时运行,而当被import时,则不运行。这部分的测试当代码就应该放在main块里。
2、类和函数的__name__变量怎么用
__name__是类和函数的一个信息,即类型的名称。在用于反射的声明,__name__才会有很好的用武之地。如果你学习过Java或者C#,对于反射这个概念应该不陌生。反射本身是一个很大的话题,本文只是抛砖引玉,请各位感兴趣的读者自行搜索学习。