【问题标题】:Why does simply importing a python module executes everything present in that module ? [duplicate]为什么简单地导入 python 模块会执行该模块中存在的所有内容? [复制]
【发布时间】:2014-08-17 02:29:27
【问题描述】:

最近我注意到使用模块是保持我的 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() 正在执行?

模块中不允许初始化吗? 如果我只想要类团队结构而不想要模块的其他东西,我该怎么办? 如果我在某处错了,请纠正我。

【问题讨论】:

    标签: python python-2.7 python-module


    【解决方案1】:

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

    如果您不想在导入时运行模块的某些部分,则只有在直接运行文件时才这样做

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

    【讨论】:

      【解决方案2】:
      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()
      

      【讨论】:

        【解决方案3】:

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

        指定要导入的内容不会改变整个模块被执行的事实,之后只有单个绑定被 import 放入范围内。

        标准做法是在导入时将您不想想要执行的任何代码放在警卫之后:

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

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


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

        【讨论】:

          猜你喜欢
          • 2014-06-07
          • 1970-01-01
          • 2021-03-13
          • 2013-07-31
          • 2018-06-29
          • 1970-01-01
          • 1970-01-01
          • 2012-03-07
          相关资源
          最近更新 更多