2016-01-22 61 views
1

使用python 2.7.6,我一直在嘗試編寫一個類,可以從給定的zip文件中的幾個xml文件中提取xml數據片段。我希望能夠按照任何順序使用任何一種方法,因此我希望解壓縮舞臺能夠在課堂上幕後。我可以在def __init__中添加方法嗎?

這是我第一次真正嘗試真正使用一個類,因爲我對Python非常陌生,所以我正在學習。

我定義了將數據解壓縮到內存的方法,並在其他方法中使用這些方法 - 然後意識到使用多種方法時效率會非常低下。由於解壓縮步驟對於類中的任何方法都是必需的,有沒有辦法將它構建到init定義中,因此只有在首次創建類時纔會執行一次?

的例子是我目前有:

class XMLzip(object): 
    def __init__(self, xzipfile): 
     self.xzipfile = xzipfile 

    def extract_xml1(self): 
     #extract the xmlfile to a variable 

    def extract_xml2(self): 
     #extract xmlfile2 to a variable 

    def do_stuff(self): 
     self.extract_xml1() 
     .... 

    def do_domethingelse(self): 
     self.extract_xml1() 

有沒有辦法做這樣的事情我已經如下圖所示?如果是這樣,那叫什麼 - 我的搜索不是很有效。

class XMLzip(object): 
    def __init__(self, xzipfile): 
     self.xzipfile = xzipfile 

     def extract_xml1() 
      # extract it here 

     def extract_xml2() 
      # extract it here 

    # Now carry on with normal methods 
    def do_stuff(self): 
     ... 
+1

是的,這是可能的嗎?什麼是問題?爲什麼不在'__init__'中使用提取方法而不是在那裏定義它們? – timgeb

+0

這是怎麼做的?我從來沒有在一個例子中看到它。它有名字嗎?它可以幫助我搜索一個。 – emmalg

+0

你的意思是像我現在那樣定義提取方法,但是在init部分調用它們?這是如何工作的? – emmalg

回答

2

在任何你想以初始化您的類,在這種情況下,__init__你能做到像你所需要的是這樣的

class XMLzip(object): 
    def __init__(self, xzipfile): 
     self.xzipfile = xzipfile 
     self.xml1 = #extract xml1 here 
     self.xml2 = #extract xml2 here 

    def do_stuff(self): 
     ... 
,如果你想要做的提取部分只有一次

,然後執行此操作並將結果保存在類的實例中的附加屬性中。

我懷疑提取過程是非常相似的,所以你可以在你的課堂或外部使它成爲一個函數,這取決於你的偏好,並給出額外的參數來處理特殊性,例如像這樣的

外面版本

def extract_xml_from_zip(zip_file,this_xml): 
    # extract the request xml file from the given zip_file 
    return result 

class XMLzip(object): 
    def __init__(self, xzipfile): 
     self.xzipfile = xzipfile 
     self.xml1 = extract_xml_from_zip(xzipfile,"xml1") 
     self.xml2 = extract_xml_from_zip(xzipfile,"xml2") 

    def do_stuff(self): 
     ... 

內部版本

class XMLzip(object): 
    def __init__(self, xzipfile): 
     self.xzipfile = xzipfile 
     self.xml1 = self.extract_xml_from_zip("xml1") 
     self.xml2 = self.extract_xml_from_zip("xml2") 

    def extract_xml_from_zip(self,this_xml): 
     # extract the request xml file from the zip_file in self.xzipfile 
     return result 

    def do_stuff(self): 
     ... 
2

您可以調用您在初始化程序中在類中定義的任何方法。

演示:

>>> class Foo(object): 
... def __init__(self): 
...  self.some_method() 
... def some_method(self): 
...  print('hi') 
... 
>>> f = Foo() 
hi 

我從你的問題,你只需要一次提取文件服用。讓你的課堂保持原樣並在__init__中使用提取方法,併爲提取的內容設置必需的屬性/變量。

例如

def __init__(self, xzipfile): 
    self.xzipfile = xzipfile 
    self.extract1 = self.extract_xml1() 
    self.extract2 = self.extract_xml2() 

當然,這需要你的提取方法有返回值,不要忘記這一點。

+0

非常好的答案謝謝,@timgeb,如果其他人看到這個問題,我已經接受了另一種方法,但是謝謝。 – emmalg

相關問題