python - 了解python的主要方法

我是 Python 新手,但我有其他 OOP 语言的经验。我的类(class)没有讲解python中的主要方法。

请告诉我主要方法在 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()

最佳答案

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

语义有点微妙。 __name__ 标识符在导入时绑定(bind)到任何模块的名称。然而,当一个文件被执行时,__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__ 行上方的所有代码在这两种情况下都被执行和评估是很重要的。它在文件被导入或执行时由解释器评估。如果您在 if __name__ 行之前放置 print 语句,那么每次任何其他代码尝试将其作为模块导入时,它将打印输出。 (当然,这会反社会。不要那样做。

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

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

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

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

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

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

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

https://stackoverflow.com/questions/22492162/

相关文章:

python - 为什么不自动调用父类(super class) __init__ 方法?

python - 在 localhost 上,我如何选择一个空闲端口号?

Python 风格 - 用字符串续行?

linux - SVN中结帐和导出的区别

c - 如何在 C 中使用/dev/random 或 urandom?

python - Django admin 中同一模型的多个 ModelAdmins/ View

linux - linux命令末尾的 "&"是什么意思?

python - Jinja2 简写条件

linux - 在 grep 中转义双引号

python - Python 2和3之间numpy数组的pickle不兼容