5

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

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

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

4

5 回答 5

3

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

于 2012-08-17T17:23:15.650 回答
1

正如其他人指出的那样,第二个print语句正在执行,因为它是构成类声明的一组语句之一——所有这些语句在它们所在的模块时执行是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

import x  # no print statements execute
obj = d()  # both print statements will be executed now
于 2012-08-18T00:54:44.887 回答
1

如果您只想在导入期间禁止打印(或任何其他可执行语句),请检查顶级模块执行情况:

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

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

于 2012-08-17T19:00:31.667 回答
0

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

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

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

于 2012-08-17T17:53:04.540 回答
0

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

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

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

于 2014-05-09T09:17:39.493 回答