了解 Python 的主要方法

我是 Python 的新手,但我有其他面向对象编程语言的经验。我的课程没有解释 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()
392735 次浏览

如果导入模块(。Py)文件,现在正在从另一个 python 脚本创建该文件,它将 没有执行其中的代码

if __name__ == '__main__':
...

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

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

这是在 Python.berkely.edu中进一步扩展的

Python 没有像 Java、 C、 C + + 等这样定义的入口点。相反,它只是逐行执行源文件。if语句允许您创建一个 main函数,如果您的文件作为“ 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

更多关于 main ()- < a href = “ http://ibibleo.org/g2swap/byteofpython/read/module-name.html”rel = “ noReferrer”> http://ibiblio.org/g2swap/byteofpython/read/module-name.html

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

“ 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)来说,这是相当常见的,如果您希望以类似于其他编程语言的方式定义 main,那么可以让 if __name__ == '__main__':简单地调用 main(*sys.argv[1:])。如果你。Py 文件主要用作其他代码中的模块,那么您可以在 if __name__ == '__main__:'套件中调用 def test_module()test_module()

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