2015-07-01 52 views
0

我的問題主要涉及如何在Python中的類中使用with關鍵字。從Python中的多個方法訪問類文件

如果您有一個包含文件對象的類,那麼如何使用with語句(如果有的話)。

例如,我在這裏不使用with

class CSVLogger: 
    def __init__(self, rec_queue, filename): 
     self.rec_queue = rec_queue 
     ## Filename specifications 
     self.__file_string__ = filename 
     f = open(self.__file_string__, 'wb') 
     self.csv_writer = csv.writer(f, newline='', lineterminator='\n', dialect='excel') 

如果我那麼做的事情在文件中的另一種方法,例如:

def write_something(self, msg): 
     self.csv_writer(msg) 

這是合適的?我應該在什麼地方加入with?我只是怕一個__init__退出,with退出並可能關閉該文件?

+0

http://stackoverflow.com/a/27574601/742269 –

+0

永遠不要在雙方都給出自己的屬性或方法雙下劃線。這些名稱是爲了Python自己的屬性而設計的,你可以覆蓋它們,但不能定義你自己的屬性。 –

回答

1

是的,你是正確的,當它的範圍結束with自動關閉文件,所以如果你在__init__()功能使用with聲明中,write_something功能是行不通的。

也許你可以使用with語句在程序的主要部分,而不是在__init__()功能打開文件,你可以在文件對象作爲參數傳遞給__init__()功能。然後在with區塊內的文件中執行所有您想要執行的操作。

示例 -

類會是什麼樣子 -

class CSVLogger: 
    def __init__(self, rec_queue, filename, f): 
     self.rec_queue = rec_queue 
     ## Filename specifications 
     self.__file_string__ = filename 
     self.csv_writer = csv.writer(f, newline='', lineterminator='\n', dialect='excel') 
    def write_something(self, msg): 
     self.csv_writer(msg) 

主程序可以像 -

with open('filename','wb') as f: 
    cinstance = CSVLogger(...,f) #file and other parameters 
    .... #other logic 
    cinstance.write_something("some message") 
    ..... #other logic 

但如果這種複雜事情,很多,你最好不要使用with語句,而確保在需要結束時關閉該文件。

相關問題