我有一个最初作为一个长函数留下的脚本。
#! /usr/bin/env python
import mechanize
from BeautifulSoup import BeautifulSoup
import sys
import sqlite3
def dictionary(word):
br = mechanize.Browser()
response = br.open('http://www.dictionary.reference.com')
br.select_form(nr=0)
br.form['q'] = word
br.submit()
definition = BeautifulSoup(br.response().read())
trans = definition.findAll('td',{'class':'td3n2'})
fin = [i.text for i in trans]
query = {}
word_count = 1
def_count = 1
for i in fin:
query[fin.index(i)] = i
con = sqlite3.connect('/home/oberon/vocab_database/vocab.db')
with con:
spot = con.cursor()
spot.execute("SELECT * FROM Words")
rows = spot.fetchall()
for row in rows:
word_count += 1
spot.execute("INSERT INTO Words VALUES(?,?)", (word_count,word))
spot.execute("SELECT * FROM Definitions")
rows = spot.fetchall()
for row in rows:
def_count += 1
for q in query:
spot.execute("INSERT INTO Definitions VALUES(?,?,?)", (def_count,query[q],word_count))
def_count += 1
return query
print dictionary(sys.argv[1])
现在,我想通过创建一个类来练习 OOP 形式。我认为最好也将其分成至少几个函数。
我想出了:
#! /usr/bin/env python
import mechanize
from BeautifulSoup import BeautifulSoup
import sys
import sqlite3
class Vocab:
def __init__(self):
self.word_count = 1
self.word = sys.argv[1]
self.def_count = 1
self.query = {}
def dictionary(self,word):
self.br = mechanize.Browser()
self.response = self.br.open('http://www.dictionary.reference.com')
self.br.select_form(nr=0)
self.br.form['q'] = word
self.br.submit()
self.definition = BeautifulSoup(self.br.response().read())
self.trans = self.definition.findAll('td',{'class':'td3n2'})
self.fin = [i.text for i in self.trans]
for i in self.fin:
self.query[self.fin.index(i)] = i
return self.query
def word_database(self):
self.con = sqlite3.connect('/home/oberon/vocab_database/vocab.db')
with self.con:
self.spot = self.con.cursor()
self.spot.execute("SELECT * FROM Words")
self.rows = self.spot.fetchall()
for row in self.rows:
self.word_count += 1
self.spot.execute("INSERT INTO Words VALUES(?,?)", (self.word_count,self.word))
self.spot.execute("SELECT * FROM Definitions")
self.rows = self.spot.fetchall()
for row in self.rows:
self.def_count += 1
for q in self.query:
self.spot.execute("INSERT INTO Definitions VALUES(?,?,?)", (self.def_count,self.query[q],self.word_count))
self.def_count += 1
Vocab().dictionary(sys.argv[1])
我知道在我调用Vocab().dictionary(sys.argv[1])的最后一行时,这只会运行字典方法。我试图弄清楚每次我仍然运行脚本时如何调用word_database方法。
这是错误的方法吗?我应该把这些方法作为一种大方法吗?