我的问题是关于我有一个包含类的文件,在这个类里面会有一堆代码被执行
所以每当我导入该文件时它都会被执行!没有创建类的对象! ,这是一个例子
文件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
,所以我的问题是如何在创建新对象之前跳过执行它?
答案 0 :(得分:2)
你不能在Python中这样做,在Python中,每个类都是第一级对象,Python类也是一个对象,即使没有该类的实例,也可以存在类属性。如果您只想取消print语句的输出,可以在导入时重定向print语句的输出,或者创建类似this first answer中提供的上下文的上下文,并手动使用__import__
语句。
答案 1 :(得分:0)
(如果对未来读者有用,请复制以上评论)
同意@mgilson和@EmmettJButler - 这段代码可能最适合__init__
。当Python导入模块时,它会执行模块级代码,包括使用类方法构建类定义等。因此,当import X
和class 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__
内,在实例创建后调用它。