【问题标题】:importing without executing the class - python在不执行类的情况下导入 - python
【发布时间】:2012-08-14 03:48:42
【问题描述】:

我的问题是关于我有一个包含类的文件,并且在这个类中有一堆代码将被执行

所以每当我导入该文件时,它都会执行!不创建类的对象! , 这里是例子

文件X

class d:
    def __init__(self):
        print 'print this will NOT be printed'
    print "this will be printed"

文件B

import x

输出是this will be printed,所以我的问题是如何在创建新对象之前跳过执行它?

【问题讨论】:

  • "如何在创建新对象之前跳过执行" -- 为什么不像其他的一样把它放在__init__ 中呢?
  • 为什么不把第二个print 放在__init__ 方法中呢?我认为__init__ 可能是您要查找的内容,因为根据定义,代码在对象创建时运行
  • 好吧,因为真实的类比示例大很多,大约 350 行,所以很难重新修改它
  • 同意@mgilson 和@EmmettJButler。当 Python 导入一个模块时,它会执行模块级代码,包括使用类方法构建类定义等。因此,当您导入 X 时,会构建 class d 的定义(因此您可以从 @987654331 调用它@),它执行类内部的代码。通常这意味着您将设置类级变量和准备附加到实例的未绑定方法,但在您的情况下,这意味着将打印该语句。比我更精通 Python 的人可以纠正我/更好地说明这一点:)
  • 发布了答案,然后阅读 cmets。 @RocketDonkey 是正确的。使该评论成为答案的唯一缺少的是“......所以将您的代码重构为方法”。 RD,如果您将其发布为答案,我会为您 +1。

标签: python class object python-2.7 call


【解决方案1】:

你不能在 Python 中这样做,在 Python 中,每个类都是第一级对象,Python 类也是一个对象,即使没有该类的实例,类属性也可以存在。如果您只想抑制 print 语句的输出,您可以在导入时刻重定向 print 语句的输出,或者创建一个类似 this first answer 中提供的上下文并手动使用 __import__ 语句。

【讨论】:

    【解决方案2】:

    (从上面的评论中复制,以防对未来的读者有用)

    同意@mgilson 和@EmmettJButler - 这段代码可能最好放在__init__ 中。当 Python 导入一个模块时,它会执行模块级代码,包括使用类方法构建类定义等。因此,当您构建 import Xclass d 的定义时(因此您可以从 @ 调用它987654324@),它执行类内部的代码。通常这意味着您将设置类级变量和准备附加到实例的未绑定方法,但在您的情况下,这意味着您的语句将被打印。

    按照其他人的建议,重构代码可能是您最好的选择。

    【讨论】:

      【解决方案3】:

      如果您只想在导入期间禁止打印(或任何其他可执行语句),请在它们周围加上顶部模块执行检查:

      if __name__ == '__main__':
          print 'this will be printed'
      

      这将在导入期间阻止打印,但在模块加载时允许打印 以交互方式执行。

      【讨论】:

      • 它不工作,,我试图创建一个对象,但它没有打印语句
      • 为了打印该行,我执行了:python -i x.py。为了抑制打印,我执行了:python -i b.py。请显示您尝试使用的代码,并告诉我您是如何调用它的。
      • OP 想知道“如何在创建新对象之前跳过执行它”,而不取决于模块是否已导入。直到现在我自己都不知何故错过了。
      • 也错过了。在这种情况下,许多其他人提出的将代码移动到 init 或类似的建议似乎是最好的解决方案。
      【解决方案4】:

      正如其他人指出的那样,第二个 print 语句正在执行,因为它是构成类声明的一组语句之一——所有这些语句都在它们所在的模块是 imported 时执行,因为声明是其顶级代码的一部分,而不是嵌套在函数或方法中。

      第一个 print 语句没有被执行,因为它是方法定义的一部分,其语句在被调用之前不会执行 --- 与类定义中的那些不同。通常,当使用类的名称创建类的实例时,会间接调用类的 __init__() 方法,对于像您这样名为 d 的类的名称,该方法将是 d()

      因此,尽管它与正在显示的字符串文本中的内容相矛盾,但要使第二个 print 语句仅在创建类实例时执行(就像第一个实例一样),您还需要使它是同一方法的一部分(或由它调用)。换句话说,这样做之后,当类所在的文件是imported 时,它们都不会执行,但在创建类的任何实例时两者都会执行。这就是我的意思:

      文件x.py

      class d:
          def __init__(self):
              print 'print this will NOT be printed'  # not true
              print "this will be printed when object is created"
      

      文件b.py

      import x  # no print statements execute
      obj = d()  # both print statements will be executed now
      

      【讨论】:

        【解决方案5】:

        你的问题是:我有一个函数

        def f():
            print(1)
            print(2)
        

        如何让 print(1) 被执行,而不是 print(2)?真的没有简单的方法。你要明白的是def __init__(self)也是一个声明。您的课程由该语句和打印语句组成。没有简单的方法来执行一个但不是另一个。当然,如果你可以更改类的来源,只需将 print 放在__init__ 中,实例创建后会调用它。

        【讨论】:

          猜你喜欢
          • 2016-06-21
          • 2013-08-22
          • 1970-01-01
          • 2021-12-04
          • 2022-11-12
          • 2014-12-16
          • 1970-01-01
          • 2021-12-05
          • 1970-01-01
          相关资源
          最近更新 更多