本问题已经有最佳答案,请猛点这里访问。
我对python不熟悉,但我有其他oops语言的经验。我的课程没有解释Python中的主要方法。
请告诉我Python中的主要方法是如何工作的?我很困惑,因为我试图把它比作Java。
def main():
# display some lines
if __name__ =="__main__": main()
主要是如何执行的,为什么我需要这个奇怪的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()
你不需要if,你可以只写main(),也可以工作。
@鲁本伯穆德兹的坏主意,这违背了全部要点。使用主函数可以将文件导入到repl中而不作为脚本运行,这就是if语句所做的。如果您不使用if,脚本将在您不希望的时间运行,例如导入该模块。
@Alexthornton这是否意味着您不应该使用main()作为包装函数?如果是这样的话,对于这样的包装器函数是否有某种命名约定?
@juil@alexthornton的意思是,直接调用main(),而不使用if,是一个坏主意。定义名为main的函数完全没有问题。即使你称之为my_entry_point,这不是问题,但问题是如果你无条件地称my_entry_point(),而没有if。重点是没有if==坏主意。
"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__)
使用此约定,可以有一个文件定义类和函数,用于其他程序,还可以包含仅当文件作为独立脚本调用时才计算的代码。
重要的是要理解,在这两种情况下,if __name__行上面的所有代码都正在执行、评估中。它由解释器在文件导入或执行时进行评估。如果您将print语句放在if __name__行之前,那么每当任何其他代码试图将其作为模块导入时,它都会打印输出。(当然,这是反社会的。不要那样做。
我个人喜欢这些语义。它鼓励程序员将功能(定义)与功能(执行)分开,并鼓励重用。
理想情况下,如果从命令行调用,几乎每个Python模块都可以做一些有用的事情。在许多情况下,这用于管理单元测试。如果一个特定的文件定义了仅在系统其他组件上下文中有用的功能,那么仍然可以使用__name__ =="__main__"来隔离一个代码块,该代码块调用一组适用于该模块的单元测试。
(如果您没有任何这样的功能或单元测试,最好确保文件模式不可执行)。
小结:if __name__ == '__main__':有两个主要的用例:
允许模块提供导入到其他代码的功能,同时作为独立脚本(围绕功能的命令行包装器)提供有用的语义。
允许模块定义一组单元测试,这些测试与要测试的代码一起存储(在同一个文件中),并且可以独立于代码库的其余部分执行。
它对于def main(*args)是相当常见的,如果您希望以类似于其他编程语言的方式定义main,那么if __name__ == '__main__':只需调用main(*sys.argv[1:])。如果您的.py文件主要用于在其他代码中用作模块,那么您可以使用def test_module()并在if __name__ == '__main__:'套件中调用test_module()。
(Ruby还实现了类似的特性if __file__ == $0)。
值得注意的是,在if name='main':构造中,对于Python来说没有什么特别的地方。就像其他条件语句一样…您可以有多个if-name='main':它们的功能与任何其他Python脚本中的任何其他条件和语句套件一样。
另外,__name__ =="__main__"之外的语句只在您第一次导入给定会话中的模块以及显式重新加载模块时运行。这就是为什么修改源代码和尝试导入通常不能按预期工作的原因。
在Python中,执行不必从main开始。"可执行代码"的第一行先执行。
def main():
print("main code")
def meth1():
print("meth1")
meth1()
if __name__ =="__main__":main() ## with if
输出-
meth1
main code
关于main()的更多信息-http://ibiblio.org/g2swap/byteofpython/read/module-name.html
模块的__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'
输出-
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
它是如何工作的
每个python模块都定义了它的__name__,如果定义了__main__,则意味着该模块是由用户独立运行的,我们可以执行相应的操作。
实际上,执行的第一行是def main():。
@疯子物理学家只是想说清楚:首先执行是因为它是第一行,而不是因为它是def main()。
@尼特沃德凯特。对的。对名称main没有特别说明。整个模块逐行执行,自上而下。执行每个def和class语句以在模块命名空间中创建函数和类对象。这些对象由代码和元数据组成,在显式调用之前不会运行这些代码和元数据。
Python没有定义的入口点,如Java、C、C++等,而是简单地逐行执行源文件。if语句允许您创建一个main函数,如果您的文件作为"主"模块而不是作为另一个模块中的库加载,该函数将被执行。
清楚地说,这意味着Python解释器从文件的第一行开始并执行它。执行诸如class Foobar:和def foobar()之类的行可以创建一个类或一个函数,并将它们存储在内存中以供以后使用。
你能告诉我在我的代码中哪一行是先执行的吗?
第一行首先执行。
通常在if __name__ =="__main__"行之前有类和函数定义,因此这些定义将首先执行。
如果从另一个python脚本导入正在创建的模块(.py)文件,它将不会在
if __name__ == '__main__':
...
如果您直接从控制台运行脚本,它将被执行。
python不使用或不需要main()函数。任何不受该保护的代码将在模块执行或导入时执行。
这在python.berkely.edu中进行了更多的扩展。