2017-05-27 8 views
0

Pythonでクラス変数を扱う際に問題があります。私は次のようなコードを持っています。その関数の上のコード?あるいは、「リソース」をクリアする方法はありますか?Python - クラス変数がリソースであるときにクラス変数を自動的にクリアする方法

私のPythonバージョンは3.6です

+0

を使用すると、クラスが「クリア」されたときに、何を意味する私は、各メソッドが呼び出された場所を表示するprint Sを使うのか? –

+0

私は、tempclassの(オブジェクトの)データのデータをオーバーライドするとき、あなたはお話していると思いますか?あなたができることは、まず、resource.close()を実行してから、入力メソッドが何であれオブジェクトを設定し、通常のobj =(新しいもの)の代わりにこれを使用する、tempクラスのメソッドを作成することです。 –

+0

インスタンスではなくクラスを使用する理由はありますか?インスタンスでコンテキストマネージャを使用する方が簡単です。例えば、 –

答えて

0

クラス変数を使用しないでください。あなたのPythonインタプリタがシャットダウンされていない限り、おそらくクラスが存在する限り、クラス変数は生きています。

import contextlib 

# I don't have xlwings so I create some class that acts like it: 
class Book(object): 
    def __init__(self): 
     print('init') 

    def close(self): 
     print('close') 

実際の「コンテキスト」を作成し、このように使用することができます:あなたは、単に(たとえばcontextlib.closing用)contextmanagerを使用することができます閉じする必要がressourcesと通常

。ブロック内でリソースは生きており、ブロックが終了した後に閉じます。

print('before the context') 
with contextlib.closing(Book()): 
    print('inside the context') 
print('after the context') 

出力します:

before the context 
init 
inside the context 
close 
after the context 
+0

うーん...しかし、私が "contextlib"を使用する場合、 "with"スコープ内に "Book"を使用するすべてのコードを記述する必要があります。実際、私のコードでは、私のプログラムがシャットダウンされるまで、すべての 'TempClass'インスタンスが 'リソース'を使います。 –

+0

個人的には、プログラムがシャットダウンするまでファイルハンドルを開いたままにしておきません。たいていの場合、あなたはほんのわずかな部分でしか必要とせず、コンテキストマネージャに簡単に入れることができます。 – MSeifert

+0

@YounghoonJeongはい、すべてが 'with'スコープ内で起こります。ブロックを関数に入れ、 'Book'をパラメータとして渡します。 –

関連する問題