理解python的主要方法

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__:'

  • (Ruby也实现了类似的功能if __file__ == $0).

  • 值得注意的是,在if __name__ =='__ main__':构造中,Python没有什么特别之处.它就像任何其他条件语句一样......并且你可以有多个if __name__ =='__ main__':它们的功能就像任何其他Python脚本中的任何其他条件和语句套件一样. (2认同)
  • 此外,`__name__ =="__ main __"`之外的语句仅在第一次导入给定会话中的模块时以及显式重新加载时运行.这就是为什么修改源代码并尝试导入通常不能按预期工作的原因. (2认同)

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__,它意味着模块由用户独立运行,我们可以做相应的适当操作.

  • 实际上执行的第一行是`def main():`. (5认同)
  • @MadPhysicist只是要清楚:它首先执行是因为它是第一行,而不是因为它是`def main()`。 (2认同)

Cod*_*ice 18

Python没有像Java,C,C++等定义的入口点.它只是逐行执行源文件.该if语句允许您创建一个main函数,如果您的文件作为"Main"模块而不是另一个模块中的库加载,将执行该函数.

要清楚,这意味着Python解释器从文件的第一行开始并执行它.执行类似行class Foobar:def foobar()创建类或函数,并将它们存储在内存中供以后使用.

  • 首先执行第一行. (9认同)
  • 通常你会在`if __name__ =="__main __"`行之前有类和函数定义,所以这些将首先被执行. (4认同)

Aar*_*ron 8

如果您导入现在从另一个python脚本创建的模块(.py)文件,它将不会执行其中的代码

if __name__ == '__main__':
    ...
Run Code Online (Sandbox Code Playgroud)

如果直接从控制台运行脚本,它将被执行.

Python不使用或不需要main()函数.任何未受该保护保护的代码将在执行导入模块时执行.

这在python.berkely.edu上进一步扩展