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

v1h*_*1h5 4 python python-module python-2.7

最近我注意到使用模块是保持我的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()
Run Code Online (Sandbox Code Playgroud)

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

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

#This is oop1.py.          
#Importing module oop

from oop import Team
Run Code Online (Sandbox Code Playgroud)

python oop1.py终端的输出是:

class Team initialized
Team name:  Man-Utd ,Rank : 1
Run Code Online (Sandbox Code Playgroud)

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

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

Bak*_*riu 8

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

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

这是标准的做法,把你做任何代码想要一个后卫后导入时执行:

if __name__ == '__main__':
    # your code here
Run Code Online (Sandbox Code Playgroud)

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


要了解更多关于模块读取文件.还有一节解释了上面提到的警卫:执行模块作为脚本