python - 在类中重复函数

时间:2012-10-09 05:39:51

标签: python class dry

首先,如果我使用错误的术语或者我对基本概念的理解存在缺陷,请原谅我。我只是学习如何构建使用类的脚本......并且是Python /编码的相对新手。

原则上,我很想知道是否有一种方法可以在一个类中调用两次相同的func。如果我简要解释一下我想要做什么,那可能会有所帮助......

我正在尝试编写一个web'scraper'来解析一个种子网页,根据一些给定的参数返回URL,跟踪这些URL,做同样的事情(可能是n次),最后在底部返回一个pdf链接。这是为了加快我的同事目前手动收集的一些内容。 (我已用相对基本的前一次迭代保存了几个月的手动工作量。)

这是我目前使用的一种方法,但我编写的代码实际上不是可扩展的,也不是可以重复使用的,我想尝试使其更具通用性(我现在正在为每个实例编写脚本)。

(我认为)我想构建一个名为siteInstance的类,用于保存种子URL,保存位置,标题,u:p,cookie和各种函数。我用来遍历网站以获取目标内容。

我使用了一个重复的函数来解析目标URL并返回下一层URL。这些是基于某些特定于站点的RegEx,因此我知道我必须为每个URL层提供搜索过滤器(regEx)。我希望能够重用解析器,但需要使用特定于层的Regex。干是对的吗?

在我看来,这意味着我有一个名为siteInstance.parser的函数,我在每个siteInstance.class中构造了一些(例如siteInstance.parserA表示第一层,siteInstance.parserB表示第二层。 。siteInstance.parsern为第n层)

Follows是一个简化版本,实际上每层都有许多清理/准备步骤,以便为下一层正确生成目标URL列表。这包括为保存的二进制文件创建文件结构,编写日志,以及为该层等触发RegEx等。

这是一个两层示例,但我知道至少有4层内容的实例。

示例:种子 {URL:www.journalTitle.com}

第一次通过的结果(Layer1): [{IssueURL2010:www.journalTitle.com/2010},{IssueURL2011:www.journalTitle.com/2011},{IssueURL2012:www.journalTitle.com/2012},{IssueURLn:www.journalTitle.com/n}]

对于IssueURL2010(第2层): [{article1_2010URL:www.journalTitle.com/2010/1},{article2_2010URL:www.journalTitle.com/2010/2},{article3_2010URL:www.journalTitle.com/2010/3},{articlen_2010URL:www.journalTitle.com/2010/n}]

article1_2010UR我可以www.journalTitle.com/2010/1.pdf

我希望这是有道理的......

1 个答案:

答案 0 :(得分:2)

您可以在单独的类中定义解析逻辑,只需在实例(或类)属性中实例化几次:

class URLParser(object):
    def __init__(self, regexp, ...):
        self.regexp = regexp
        ...

    def parse_urls(self, urls):
        # do your URL parsing thing
        # return parsed URLs

class SiteInstance(object):
    def __init__(self, ...):
        self.parsers = [
            URLParser('regexp1'),
            URLParser('regexp2'),
            ...
        ]

    def parse(self, ...):
        ...
        for parser in self.parsers:
            parser.parse_urls(...)