了解python的主要方法

我是Python的新手,但我有其他OOPS语言的经验。 我的课程没有解释在Python中的主要方法。

请告诉我主要的方法如何在Python中工作? 我很困惑,因为我正在比较它与Java。

def main(): # display some lines if __name__ == "__main__": 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的“主要”方法几乎是独特的语言(*)。

语义有点微妙。 __name__标识符被绑定到任何模块的名称,因为它正在被导入。 但是,当一个文件被执行时, __name__被设置为"__main__" __name__ "__main__" (文字string: __name__ )。

这几乎总是用于将应该执行的代码部分与定义function的代码部分分开。 所以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语句, if __name__其他代码尝试将其作为模块导入时,都会打印输出。 (当然,这将是反社会的,不要这样做)。

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

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

(如果你不会有任何这样的function和unit testing,而不是确保文件模式不可执行)。

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

  • 允许模块提供用于导入到其他代码的function,同时还提供有用的语义作为独立脚本(围绕function的命令行封装)
  • 允许一个模块定义一组unit testing,这些unit testing存储在要testing的代码中(在同一个文件中),并且可以独立于代码库的其余部分执行。

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

  • if __file__ == $0 Ruby也会实现类似的function)。

在Python中,执行不必从main开始。 首先执行“可执行代码”的第一行。

 def main(): print("main code") def meth1(): print("meth1") meth1() if __name__ == "__main__":main() ## with if 

输出 –

 meth1 main code 

更多关于main() – http://ibiblio.org/g2swap/byteofpython/read/module-name.html

模块的__name__

每个模块都有一个名称,模块中的语句可以查找其模块的名称。 在一个特定的情况下,这是特别方便的 – 如前所述,当一个模块被首次导入时,该模块中的主块被运行。 如果我们只是在程序本身被使用而不是从另一个模块导入的时候运行程序块呢? 这可以使用模块的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__ ,则意味着模块正在被用户独立运行,我们可以做相应的适当的操作。

Python没有像Java,C,C ++等定义的入口点,而是简单地逐行执行一个源文件。 if语句允许您创build一个main函数,如果您的文件作为“主”模块加载,而不是另一个模块中的库,则会执行该函数。

如果你从另一个python脚本导入你正在创build的模块(.py)文件,它将不会执行其中的代码

 if __name__ == '__main__': ... 

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

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

这是python.berkely.edu多一点