2017-05-27 20 views
0

我有一個用Python處理類變量的一個問題。我有一個代碼如下。Python的 - 如何自動清除類變量時,類變量是資源

class TempClass: 
    resource = xlwings.Book() # xlwings is a library manipulating Excel file. 

    #... 

這裏,以清除「資源」,我需要執行

resource.close() 

是否有當一個類(不是對象)被清除調用的任何內置的功能,讓我可以寫上面的代碼在那個函數中?或者有什麼方法可以清除「資源」?

我的Python版本是3.6

+0

你是什麼意思,當一個類被「清零」? –

+0

我的猜測是你在談論什麼時候重寫(一個?的對象?)tempclass的數據。你可以做的是在臨時類中創建一個方法,首先執行resource.close(),然後將該對象設置爲任何輸入方法,然後使用它而不是正常的obj =(new thing)。 –

+0

你有沒有理由使用類而不是實例?您可以更輕鬆地使用具有實例的上下文管理器。參見[**'closing' **](https://docs.python.org/3/library/contextlib.html#contextlib.closing)例如 –

回答

0

請勿使用類變量。只要該類存在,只要你的python解釋器沒有關閉,一個類變量就是活着的。

通常與需要ressources被關閉,你可以簡單地使用contextmanager(例如contextlib.closing):

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') 

實際的「上下文」可以創建和這樣使用。塊內部資源處於活動狀態,並在塊結束後關閉。我用print s到顯示每個方法被稱爲:

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」,我需要將所有使用「Book」的代碼寫入「scope」中。實際上,在我的代碼中,所有'TempClass'實例都使用'resource'直到我的程序關閉。 –

+0

就我個人而言,在程序關閉之前,我不會保留文件句柄。大多數情況下,您只需要很少的部分就可以輕鬆地將它們放入上下文管理器。 – MSeifert

+0

@YungnghoonJeong是的,所有事情都會在'範圍內發生。將該塊放入函數中,並將'Book'作爲參數傳遞。 –