2016-01-22 63 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

相关问题