为什么简单地导入python模块会执行该模块中的所有内容?

时间:2014-06-26 09:36:48

标签: python python-2.7 python-module

最近我注意到使用模块是保持我的python编程整洁的好选择。 为了开始,我创建了一个模块(名为oop.py),其中包含一个类,如下所示:

#Module named oop

class Team:

    def __init__(self):
            print "class Team initialized"

    def displayTeam(self):
            print "Team name: ", self.name, ",Rank :" , self.rank

    def setTeam(self,name,rank):
            self.name = name
            self.rank = rank


t1 = Team()
t1.setTeam("Man-Utd", 1)
t1.displayTeam()

根据python文档,如果我们想要使用模块中的特定属性,那么我们使用<from module_name> import <attribute>。我只想加载“班级团队”

在另一个python代码(名为oop1.py)中,我只是导入了上面的模块。 oop.py如下所述:

#This is oop1.py.          
#Importing module oop

from oop import Team

来自终端的python oop1.py输出为:

class Team initialized
Team name:  Man-Utd ,Rank : 1

通过声明from oop import Team,我希望只加载类定义。为什么来自oop.py的额外行t1 = Team() t1.setTeam("Man-Utd", 1) t1.displayTeam() 正在执行?

模块中是否不允许初始化? 如果我只想要类Team结构而不是其他模块,我该怎么办? 如果我在某处错了,请告诉我。

3 个答案:

答案 0 :(得分:8)

在python 模块中是对象。为了创建模块对象,它包含的代码是执行,找到的绑定作为属性添加到对象中。

指定要导入的内容并不会改变整个模块执行的事实,之后import将单个绑定放入作用域。

标准做法是将任何的代码在执行后导入时执行:

if __name__ == '__main__':
    # your code here

__name__是一个特殊的全局,仅在执行模块时为__main__。在导入期间,它被设置为模块的名称(因此不会执行该代码)。


要了解有关模块的更多信息,请阅读documentation。还有一节介绍了上面提到的警卫:Executing modules as scripts

答案 1 :(得分:2)

是的,您导入的每个模块的代码都将在最初的import上运行。 (因为Python是一种解释性语言,这是预期的行为。)

如果您不希望在导入上运行模块的某些部分,则只有在直接运行文件时才执行

if __name__ == "__main__":
    t1 = Team()
    t1.setTeam("Man-Utd", 1)
    t1.displayTeam()

答案 2 :(得分:1)

class Team:

    def __init__(self):
            print "class Team initialized"

    def displayTeam(self):
            print "Team name: ", self.name, ",Rank :" , self.rank

    def setTeam(self,name,rank):
            self.name = name
            self.rank = rank

if __name__ =='__main__': # use if __name__ =='__main__':, then lines will not be executed when you import.
    t1 = Team()
    t1.setTeam("Man-Utd", 1)
    t1.displayTeam()