Understanding the main method of python
我对python不熟悉,但我有其他oops语言的经验。我的课程没有解释Python中的主要方法。
请告诉我Python中的主要方法是如何工作的?我很困惑,因为我试图把它比作Java。
1 2 3 4 | def main(): # display some lines if __name__ =="__main__": main() |
主要是如何执行的,为什么我需要这个奇怪的
最小码-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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方法对于语言(*)几乎是唯一的。
语义有点微妙。
这几乎总是用来将应该执行的代码部分与定义功能的代码部分分开。因此,python代码通常包含如下行:
1 2 3 4 5 6 7 8 9 10 11 | #!/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__) |
使用此约定,可以有一个文件定义类和函数,用于其他程序,还可以包含仅当文件作为独立脚本调用时才计算的代码。
重要的是要理解,在这两种情况下,
我个人喜欢这些语义。它鼓励程序员将功能(定义)与功能(执行)分开,并鼓励重用。
理想情况下,如果从命令行调用,几乎每个Python模块都可以做一些有用的事情。在许多情况下,这用于管理单元测试。如果一个特定的文件定义了仅在系统其他组件上下文中有用的功能,那么仍然可以使用
(如果您没有任何这样的功能或单元测试,最好确保文件模式不可执行)。
小结:
- 允许模块提供导入到其他代码的功能,同时作为独立脚本(围绕功能的命令行包装器)提供有用的语义。
- 允许模块定义一组单元测试,这些测试与要测试的代码一起存储(在同一个文件中),并且可以独立于代码库的其余部分执行。
它对于
- (Ruby还实现了类似的特性
if __file__ == $0 )。
在Python中,执行不必从main开始。"可执行代码"的第一行先执行。
1 2 3 4 5 6 7 8 | def main(): print("main code") def meth1(): print("meth1") meth1() if __name__ =="__main__":main() ## with if |
输出-
1 2 | meth1 main code |
关于main()的更多信息-http://ibiblio.org/g2swap/byteofpython/read/module-name.html
模块的
每个模块都有一个名称,模块中的语句可以找到模块的名称。这在一种特殊情况下特别方便——如前所述,当第一次导入模块时,该模块中的主块将运行。如果我们只想在程序本身使用而不是从另一个模块导入时运行该块呢?这可以通过使用模块的name属性来实现。
使用模块的名称__
1 2 3 4 5 6 7 | #!/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' |
输出-
1 2 3 4 5 6 | $ python using_name.py This program is being run by itself $ python >>> import using_name I am being imported from another module >>> |
它是如何工作的
每个python模块都定义了它的
Python没有定义的入口点,如Java、C、C++等,而是简单地逐行执行源文件。
清楚地说,这意味着Python解释器从文件的第一行开始并执行它。执行诸如
如果从另一个python脚本导入正在创建的模块(.py)文件,它将不会在
1 2 | if __name__ == '__main__': ... |
如果您直接从控制台运行脚本,它将被执行。
python不使用或不需要main()函数。任何不受该保护的代码将在模块执行或导入时执行。
这在python.berkely.edu中进行了更多的扩展。