Bor*_*yev 146 python python-3.x
我是Python新手,但我有其他OOPS语言的经验.我的课程没有解释python中的主要方法.
请告诉我python中main方法的工作原理?我很困惑,因为我试图将它与Java进行比较.
def main():
# display some lines
if __name__ == "__main__": main()
Run Code Online (Sandbox Code Playgroud)
主要如何执行,为什么我需要这个奇怪if
的执行main
.当我删除时,我的代码终止而没有输出if
.
最小的代码 -
class AnimalActions:
def quack(self): return self.strings['quack']
def bark(self): return self.strings['bark']
class Duck(AnimalActions):
strings = dict(
quack = "Quaaaaak!",
bark = "The duck cannot bark.",
)
class Dog(AnimalActions):
strings = dict(
quack = "The dog cannot quack.",
bark = "Arf!",
)
def in_the_doghouse(dog):
print(dog.bark())
def in_the_forest(duck):
print(duck.quack())
def main():
donald = Duck()
fido = Dog()
print("- In the forest:")
for o in ( donald, fido ):
in_the_forest(o)
print("- In the doghouse:")
for o in ( donald, fido ):
in_the_doghouse(o)
if __name__ == "__main__": main()
Run Code Online (Sandbox Code Playgroud)
Jim*_*nis 200
"main"的Python方法几乎是语言(*)所独有的.
语义有点微妙.的__name__
,因为它是被导入标识绑定到任何模块的名称.但是,当正在执行文件时,__name__
则设置为"__main__"
(文字字符串:) __main__
.
这几乎总是用于将应该执行的代码部分与定义功能的代码部分分开.因此Python代码通常包含如下行:
#!/usr/bin/env python
from __future__ import print_function
import this, that, other, stuff
class SomeObject(object):
pass
def some_function(*args,**kwargs):
pass
if __name__ == '__main__':
print("This only executes when %s is executed rather than imported" % __file__)
Run Code Online (Sandbox Code Playgroud)
使用此约定,可以使用文件定义用于其他程序的类和函数,还包括仅在将文件作为独立脚本调用时才进行评估的代码.
重要的是要理解if __name__
在这两种情况下都要执行,评估该行上方的所有代码.解压缩程序在导入文件或执行文件时对其进行评估.如果你在行print
之前放置一个语句,if __name__
那么每当任何其他代码尝试将其作为模块导入时,它将打印输出.(当然,这将是反社会的.不要这样做).
我个人喜欢这些语义.它鼓励程序员将功能(定义)与功能(执行)分开,并鼓励重用.
理想情况下,几乎每个Python模块都可以在从命令行调用时执行一些有用的操作.在许多情况下,这用于管理单元测试.如果特定文件定义仅在系统的其他组件的上下文中有用的功能,则仍然可以使用__name__ == "__main__"
隔离代码块来调用适用于该模块的一组单元测试.
(如果您没有任何此类功能或单元测试,那么最好确保文件模式不可执行).
总结:if __name__ == '__main__':
有两个主要用例:
如果你想以一种类似于其他编程语言的方式定义main,那么它是相当常见的def main(*args)
并且if __name__ == '__main__':
只需调用它main(*sys.argv[1:])
.如果您的.py文件主要用作其他代码中的模块,那么您可以在套件中def test_module()
调用.test_module()
if __name__ == '__main__:'
if __file__ == $0
).Bor*_*yev 68
在Python中,执行不必从main开始.首先执行"可执行代码"的第一行.
def main():
print("main code")
def meth1():
print("meth1")
meth1()
if __name__ == "__main__":main() ## with if
Run Code Online (Sandbox Code Playgroud)
输出 -
meth1
main code
Run Code Online (Sandbox Code Playgroud)
更多关于main()的信息 - http://ibiblio.org/g2swap/byteofpython/read/module-name.html
一个模块 __name__
每个模块都有一个名称,模块中的语句可以找出其模块的名称.这在某种特定情况下尤其方便 - 如前所述,当第一次导入模块时,将运行该模块中的主块.如果我们只想在程序本身使用而不是从另一个模块导入时才运行块,该怎么办?这可以使用模块的name属性来实现.
使用模块的__name__
#!/usr/bin/python
# Filename: using_name.py
if __name__ == '__main__':
print 'This program is being run by itself'
else:
print 'I am being imported from another module'
Run Code Online (Sandbox Code Playgroud)
输出 -
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
Run Code Online (Sandbox Code Playgroud)
这个怎么运作 -
每个Python模块都__name__
定义了它,如果是这样__main__
,它意味着模块由用户独立运行,我们可以做相应的适当操作.
Cod*_*ice 18
Python没有像Java,C,C++等定义的入口点.它只是逐行执行源文件.该if
语句允许您创建一个main
函数,如果您的文件作为"Main"模块而不是另一个模块中的库加载,将执行该函数.
要清楚,这意味着Python解释器从文件的第一行开始并执行它.执行类似行class Foobar:
并def foobar()
创建类或函数,并将它们存储在内存中供以后使用.
如果您导入现在从另一个python脚本创建的模块(.py)文件,它将不会执行其中的代码
if __name__ == '__main__':
...
Run Code Online (Sandbox Code Playgroud)
如果直接从控制台运行脚本,它将被执行.
Python不使用或不需要main()函数.任何未受该保护保护的代码将在执行或导入模块时执行.