Python OOP项目组织

时间:2012-02-09 19:42:49

标签: python oop structure

我对Python开发人员有点新鲜 - 我正在为一些网络抓取创建一个更大的项目。我希望以#34; Python的方式来解决这个问题。尽可能地,并希望对项目结构有所帮助。以下是我现在的表现:

基本上,我有一个对象的基类,其目的是访问一个网站并将其上的一些特定数据解析为自己的数组,jobs []

minion.py

class minion:

# Empty getJobs() function to be defined by object pre-instantiation
def getJobs(self):
    pass

# Constructor for a minion that requires site authorization
# Ex:  minCity1 = minion('http://portal.com/somewhere', 'user', 'password')
# or   minCity2 = minion('http://portal.com/somewhere')
def __init__(self, title, URL, user='', password=''):
    self.title = title
    self.URL = URL
    self.user = user
    self.password = password
    self.jobs = []
    if (user == '' and password == ''):
            self.reqAuth = 0
    else:
        self.reqAuth = 1

def displayjobs(self):
    for j in self.jobs:
        j.display()

我将拥有大约100种不同的数据源。我现在这样做的方法就是为每个" Minion"创建一个单独的模块,它为该对象定义(并绑定)一个更加量身定制的getJobs()函数

示例:minCity1.py

from minion import minion
from BeautifulSoup import BeautifulSoup
import urllib2
from job import job

# MINION CONFIG
minTitle = 'Some city'
minURL = 'http://www.somewebpage.gov/'

# Here we define a function that will be bound to this object's getJobs function
def getJobs(self):
    page = urllib2.urlopen(self.URL)
    soup = BeautifulSoup(page)

    # For each row
    for tr in soup.findAll('tr'):
        tJob = job()
        span = tr.findAll(['span', 'class="content"'])

        # If row has 5 spans, pull data from span 2 and 3 ( [1] and [2] )
        if len(span) == 5:
            tJob.title = span[1].a.renderContents()
            tJob.client = 'Some City'
            tJob.source = minURL
            tJob.due = span[2].div.renderContents().replace('<br />', '')
            self.jobs.append(tJob)

# Don't forget to bind the function to the object!
minion.getJobs = getJobs

# Instantiate the object
mCity1 = minion(minTitle, minURL)

我还有一个单独的模块,它只包含所有实例化的minion对象的列表(每次添加一个时我都要更新):

minions.py

from minion_City1 import mCity1
from minion_City2 import mCity2
from minion_City3 import mCity3
from minion_City4 import mCity4

minionList = [mCity1,
              mCity2,
              mCity3,
              mCity4]

main.py引用了minionList,用于处理聚合数据的所有活动。

这对我来说似乎有点混乱,并希望有人能够勾画出更多的Pythonic方法。

谢谢你,对不起这篇长篇文章感到抱歉!

1 个答案:

答案 0 :(得分:0)

不是创建函数并将它们分配给对象(或者minion,我不是很确定),你应该使用类来代替。然后,您将为每个数据源创建一个类。

如果需要,您甚至可以让这些类继承自公共基类,但这并非绝对必要。