导入而不执行类 - python

时间:2012-08-17 17:10:53

标签: python class object python-2.7 call

我的问题是关于我有一个包含类的文件,在这个类里面会有一堆代码被执行

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

文件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,所以我的问题是如何在创建新对象之前跳过执行它?

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

(如果对未来读者有用,请复制以上评论)

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

正如其他人所建议的那样,重构代码可能是你最好的选择。

答案 2 :(得分:0)

如果要执行的操作是在导入期间禁止打印(或任何其他可执行语句),请检查顶层模块执行情况:

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

这将阻止导入过程中的打印,但在模块出现时允许打印 以交互方式执行。

答案 3 :(得分:0)

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

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

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

档案import

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

答案 4 :(得分:0)

你的问题是:我有一个功能

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

如何执行print(1)但不打印(2)?真的没有简单的方法。您必须了解的是def __init__(self)也是一种陈述。您的类由该语句和print语句组成。没有简单的方法来执行一个而不是另一个。当然,如果你可以改变类的来源,只需将打印放在__init__内,在实例创建后调用它。