私はもともと 1 つの長い関数として残していたスクリプトを持っています。
#! /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メソッドを呼び出す方法を見つけようとしています。
これは間違った方法ですか?これらのメソッドを 1 つの大きなメソッドとして残しておく必要がありますか?