理解python的主要方法

理解python的主要方法,python,python-3.x,Python,Python 3.x,我是Python新手,但我有其他OOP语言的经验。我的课程没有解释python中的主要方法 请告诉我main方法在python中是如何工作的?我很困惑,因为我试图将它与Java进行比较 def main(): # display some lines if __name__ == "__main__": main() main是如何执行的,为什么我需要这个奇怪的if来执行main。当我删除if时,我的代码将终止而不输出 最小代码- class AnimalActions: def q

我是Python新手,但我有其他OOP语言的经验。我的课程没有解释python中的主要方法

请告诉我main方法在python中是如何工作的?我很困惑,因为我试图将它与Java进行比较

def main():
# display some lines

if __name__ == "__main__": 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()
如果从另一个python脚本导入正在创建的模块(.py)文件,它将不会在其中执行代码

if __name__ == '__main__':
    ...
如果您直接从控制台运行脚本,它将被执行

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


此在

> P>中扩展了一点,Python没有定义的入口点,如java、C++、C++等,而是简单地逐行执行源文件。
if
语句允许您创建一个
main
函数,如果您的文件作为“主”模块而不是另一个模块中的库加载,则将执行该函数


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

在Python中,执行不必从main开始。“可执行代码”的第一行 首先执行

def main():
    print("main code")

def meth1():
    print("meth1")

meth1()
if __name__ == "__main__":main() ## with if
输出-

meth1
main code
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
有关main()的详细信息-

meth1
main code
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
模块的
\uuuu名称\uuuuu

每个模块都有一个名称,模块中的语句可以找到其模块的名称。这在一种特殊情况下尤其方便-如前所述,当第一次导入模块时,该模块中的主块将运行。如果我们只想在程序本身使用而不是从另一个模块导入时运行该块,该怎么办?这可以通过使用模块的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'
输出-

meth1
main code
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
它的工作原理-

meth1
main code
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
每个Python模块都定义了它的
\uuuuu name\uuuuuuu
,如果这是
\uuuu main\uuuuuu
,这意味着该模块由用户独立运行,我们可以执行相应的适当操作。

对“main”的Python方法几乎是该语言所独有的(*)

语义有点微妙。
\uuuu name\uuuu
标识符在导入任何模块时绑定到该模块的名称。但是,当执行文件时,
\uuuuu name\uuuuuu
被设置为
“\uuuuuu main\uuuuuu”
(文本字符串:
\uuuuuu main\uuuuu

这几乎总是用于将应该执行的代码部分与定义功能的代码部分分开。因此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 _u name __
行上方的所有代码都在执行、评估。在导入文件或执行文件时,解释器会对其进行评估。如果将
print
语句放在
If\uuuu name\uuuu
行之前,则每当任何其他代码尝试将其作为模块导入时,它都会打印输出。(当然,这是反社会的,不要这样做)

一、 就我个人而言,我喜欢这些语义学。它鼓励程序员将功能(定义)与功能(执行)分开,并鼓励重用

理想情况下,如果从命令行调用,几乎每个Python模块都可以做一些有用的事情。在许多情况下,这用于管理单元测试。如果特定文件定义的功能仅在系统其他组件的上下文中有用,则仍可以使用
\uuuuuu name\uuuuu==“\uuuuu main\uuuuu”
来隔离调用适用于此模块的单元测试套件的代码块

(如果您不打算进行任何此类功能或单元测试,那么最好确保文件模式不可执行)

总结:
如果uuuu name_uuuuu='\uuuuuu main_uuuu':
有两个主要用例:

  • 允许模块提供导入其他代码的功能,同时作为独立脚本提供有用的语义(围绕该功能的命令行包装器)
  • 允许模块定义一组单元测试,这些单元测试与待测试代码一起存储(在同一文件中),并且可以独立于代码库的其余部分执行
defmain(*args)
非常常见,如果想以类似于其他编程语言的方式定义main,那么只要调用
main(*sys.argv[1:])
。如果.py文件主要用作其他代码中的模块,那么您可以
def test_module()
并在
If uu name_uu='.\uu main_u:'
套件中调用
test_module()

  • (Ruby还实现了一个类似的特性
    ,如果_ufile _u==$0

您不需要if,只需编写
main()
,也可以work@RubenBermudez坏主意,这违背了全部要点。使用main函数可以将文件导入REPL,而无需作为脚本运行,这就是
if
语句所做的。如果未使用
If
,脚本将在您不希望的时间运行,例如导入该模块。@AlexThornton这是否意味着您不应使用
main()
作为包装函数?如果是这样的话,是否存在某种类型的s命名约定