我是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对"main"的处理方式几乎是该语言所独有的(*).

语义有点微妙.__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__行之前,那么每当其他代码试图将其作为模块导入时,它都会打印输出.(当然,这将是anti-social.不要这样做).

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

理想情况下,如果从命令行调用,几乎每个Python模块都可以做一些有用的事情.在许多情况下,这用于管理单元测试.如果某个特定文件定义的功能仅在系统其他组件的上下文中有用,那么仍然可以使用__name__ == "__main__"来隔离一个代码块,该代码块调用适用于该模块的一组单元测试.

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

总结:if __name__ == '__main__':有两个主要用例:

  • 允许一个模块提供导入其他代码的功能,同时作为独立脚本(围绕该功能的命令行包装器)提供有用的语义
  • 允许模块定义一组单元测试,这些单元测试与待测试代码一起存储(在同一个文件中),并且可以独立于代码库的其余部分执行.

如果您想以类似于其他编程语言的方式定义main,def main(*args)if __name__ == '__main__':相当常见,只需调用main(*sys.argv[1:])即可.如果你的.py文件主要用于其他代码中的模块,然后您可以在if __name__ == '__main__:'套件中调用def test_module()test_module().

  • (Ruby还实现了一个类似的特性if __file__ == $0).

Python-3.x相关问答推荐

根据样本量随机 Select 组内样本

"安装serial vs安装psyserial header,"""

Gekko优化超出了方程式的界限(由于某种原因,会产生变量)

如何创建多个日志(log)文件

只有在Chrome尚未打开的情况下,打开Chrome后,PySimpleGUI窗口才会崩溃

确定字符串的长度并提取前15或14个字符

无法使用诗词安装PyYaml

Django将任何查询显示为html表格

新行是pandas数据帧中旧行的组合

基于其他列的条件向Panda数据框中添加值到新列

如何将搜索结果中的所有值保存在另一个列表中?

删除给定数组中所有元素为True的所有子数组

如果原始字符串包含正斜杠,如何返回具有不同可能性的新字符串

有效地缩短列表,直到第一次和最后一次出现不同于 None 的值

Python BeautifulSoup:在 Select 语句中排除其他标签

创建一个可旋转的 3D 地球

理解 Keras 的 ImageDataGenerator 类中的 `width_shift_range` 和 `height_shift_range` 参数

创建日志(log)文件

python asyncio - 如何等待取消的屏蔽任务?

无法解码 Python Web 请求