理解python的主要方法

时间:2014-03-18 22:14:33

标签: python python-3.x

我是Python新手,但我有其他OOP语言的经验。我的课程没有解释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()

4 个答案:

答案 0 :(得分:189)

" 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)相当普遍,if __name__ == '__main__':如果要以与其他编程语言类似的方式定义main,则main(*sys.argv[1:])只需调用def test_module() 。如果您的.py文件主要用作其他代码中的模块,那么您可以test_module()并在if __name__ == '__main__:'套件中调用if __file__ == $0

  • (Ruby也实现了类似的功能{{1}})。

答案 1 :(得分:62)

在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 属性来实现。

使用模块的__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__,则意味着模块由用户独立运行,我们可以执行相应的相应操作。

答案 2 :(得分:18)

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

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

答案 3 :(得分:5)

如果你现在从另一个python脚本导入你正在创建的模块(.py)文件,执行

中的代码
if __name__ == '__main__':
    ...

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

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

python.berkely.edu

稍微扩展一下