了解python的主要方法
我是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__
行之前放置一条语句,则每当其他任何代码尝试将其导入为模块时,它将打印输出。(当然,这将是 反社会的 。不要那样做)。我个人喜欢这些语义。它鼓励程序员将功能(定义)与功能(执行)分开,并鼓励重用。
理想情况下,如果从命令行调用,几乎每个Python模块都可以做一些有用的事情。在许多情况下,这用于管理单元测试。如果一个特定的文件定义了仅在系统其他组件的上下文中有用的功能,则仍然可以
__name__ == "__main__"
用来隔离代码块,该代码块调用适用于此模块的一组单元测试。(如果您将不具有任何此类功能或单元测试,则最好确保文件模式不可执行)。
摘要:
if __name__ == '__main__':
有两个主要用例:- 允许模块提供要导入其他代码的功能,同时还提供有用的语义作为独立脚本(围绕该功能的命令行包装器)
- 允许模块定义一组单元测试,这些单元测试与要测试的代码一起存储(与该文件存储在同一文件中),并且可以独立于其余代码库执行。
如果要以类似于某些其他编程语言的方式定义main,这是相当普遍的,
def main(*args)
并且if __name__ == '__main__':
只需调用即可main(*sys.argv[1:])
。如果您的.py文件主要旨在用作其他代码中的模块,则可以在套件中def test_module()
调用。test_module()``if __name__ == '__main__:'
- (Ruby也实现了类似的功能
if __file__ == $0
)。