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 では、すべてのクラスが第 1 レベルのオブジェクトであり、Python クラスもオブジェクトであり、そのクラスのインスタンスがなくてもクラス属性が存在できます。print ステートメントの出力を抑制したいだけの場合は、インポート時に print ステートメントの出力をリダイレクトするか、この最初の回答__import__で提供されているようなコンテキストを作成して、ステートメントを手動で使用できます。

于 2012-08-17T17:23:15.650 に答える
1

インポート中に印刷 (またはその他の実行可能なステートメント) を抑制したいだけの場合は、最上位モジュールの実行のチェックでそれらを囲みます。

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

これにより、インポート中の印刷が防止されますが、モジュールが対話的に実行される場合は許可されます。

于 2012-08-17T19:00:31.667 に答える
1

他の人が指摘したように、2 番目printのステートメントは、クラス宣言を構成する一連のステートメントの 1 つであるため、実行されています。imported宣言が最上位コードの一部であるため、モジュールが含まれているときにすべてが実行されます。関数またはメソッド内にネストされていることとは対照的です。

最初のprintステートメントはメソッド定義の一部であるため実行されません。メソッド定義のステートメントは呼び出されるまで実行されません --- クラス定義内のステートメントとは異なります。通常、クラスの__init__()インスタンスがクラスの名前を使用して作成されると、クラスのメソッドが間接的に呼び出されます。これは、あなたのようなd()名前のクラスになります。d

したがって、表示される文字列のテキストの内容と矛盾しprintますが、クラスのインスタンスが作成されたときにのみその 2 番目のステートメントを実行するには (最初のステートメントと同様)、同じメソッドの一部にする必要もあります。 (またはそれによって呼び出されます)。つまり、その後、クラスが含まれているファイルが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 に答える
0

あなたの質問は次のようなものです: 私には機能があります

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

print(1) を実行し、print(2) を実行しないようにするにはどうすればよいですか? 本当に簡単な方法はありません。あなたが理解しなければならないのは、それdef __init__(self)は声明でもあるということです。クラスは、そのステートメントと print ステートメントで構成されます。一方を実行する簡単な方法はありませんが、もう一方は実行できません。もちろん、クラスのソースを変更できる場合は、__init__インスタンスの作成後に呼び出される print を 内に配置するだけです。

于 2014-05-09T09:17:39.493 に答える
0

(将来の読者に役立つ場合に備えて、上記のコメントからコピーされました)

@mgilson および @EmmettJButler に同意します。このコードは、__init__. Python がモジュールをインポートすると、クラス メソッドなどを使用してクラス定義を構築するなど、モジュール レベルのコードが実行import Xされますclass dBクラスの。通常、これは、クラスレベルの変数を設定し、バインドされていないメソッドをインスタンスにアタッチする準備ができていることを意味しますが、あなたの場合は、ステートメントが出力されることを意味します。

他の人が示唆しているように、コードをリファクタリングすることが最善の策です。

于 2012-08-17T17:53:04.540 に答える