Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python类方法_Python_Oop_Class_Methods - Fatal编程技术网

使用python类方法

使用python类方法,python,oop,class,methods,Python,Oop,Class,Methods,我有一个脚本,最初是作为一个长函数留下的 #! /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.se

我有一个脚本,最初是作为一个长函数留下的

#! /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])时,这只会运行dictionary方法。我正在试图弄清楚每次运行脚本时如何调用word\u数据库方法


这样做是错误的吗?我是不是应该把这些方法作为一个大方法放在一边?

在我看来,它就像一个脚本。唯一真正的问题是你为什么这么做

for row in rows:
        word_count += 1
而不是

word_count += len(rows)
至于您的问题,您可以通过以下方式调用word_数据库

self.word_database()

在我看来,这就像剧本一样好。唯一真正的问题是你为什么这么做

for row in rows:
        word_count += 1
而不是

word_count += len(rows)
至于您的问题,您可以通过以下方式调用word_数据库

self.word_database()

我不确定它作为一个类有什么好处,但是如果你想调用一个实例的多个方法,你需要给实例指定一个名称

vocab = Vocab()
vocab.dictionary(...)
vocab.word_database(...)

我不确定它作为一个类有什么好处,但是如果你想调用一个实例的多个方法,你需要给实例指定一个名称

vocab = Vocab()
vocab.dictionary(...)
vocab.word_database(...)

您只需要在原始脚本中的同一点调用word_数据库

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

    # Continue the script...
    self.word_database()

    return self.query

您只需要在原始脚本中的同一点调用word_数据库

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

    # Continue the script...
    self.word_database()

    return self.query
有几件事:

首先,您不需要仅仅因为将所有变量包装在一个类中就将它们命名为self.var_。如果函数调用完成后不需要该变量,只需使用局部变量即可

第二,每次Vocab使用dictionary将self.word\u database()添加到init函数
\uuuuuu init\uuuu(self,word)
,都要调用word\u数据库。这将确保这些功能始终可用

第三,如果只是将对象视为脚本并执行Vocab().dictionary(word),那么最好不要使用类结构。如果您计划使用Vocab()计算一些工作,然后以增量方式执行其他工作(重复调用字典),则保留类结构。但您当前使用它的方式就像一个函数调用。(如果保留函数调用语义,则至少应将原始函数分解为更小的部分)。

以下几点:

首先,您不需要仅仅因为将所有变量包装在一个类中就将它们命名为self.var_。如果函数调用完成后不需要该变量,只需使用局部变量即可

第二,每次Vocab使用dictionary将self.word\u database()添加到init函数
\uuuuuu init\uuuu(self,word)
,都要调用word\u数据库。这将确保这些功能始终可用


第三,如果只是将对象视为脚本并执行Vocab().dictionary(word),那么最好不要使用类结构。如果您计划使用Vocab()计算一些工作,然后以增量方式执行其他工作(重复调用字典),则保留类结构。但您当前使用它的方式就像一个函数调用。(如果保留函数调用语义,至少应该将原始函数分解为更小的部分)。

我建议首先重构,而不要使用面向对象的方法。通过上课你不会得到任何东西。只需定义两种方法,最后:

dictionary(sys.argv[1)
word_database()

我建议先进行重构,不要使用面向对象的方法。通过上课你不会得到任何东西。只需定义两种方法,最后:

dictionary(sys.argv[1)
word_database()

在第一部分中,这是我第一次将sqlite3应用到脚本中,我花了一分钟的时间思考如何在每次运行时给这个单词一个“id”。你完全正确,谢谢:)!第二部分,你是说只需将其添加到dictionary方法中就可以了?对于第一部分,这是我第一次将sqlite3应用到脚本中,每次运行它时,我都花了一分钟的时间思考如何给这个单词一个“id”。你完全正确,谢谢:)!第二部分,你是说只需将其添加到dictionary方法中?我认为这里也没有太多优势,因为没有太多的代码可以使用。我真的很想练习“表单”,我想这也没有什么好处,因为没有太多的代码可以使用。我真的很想练习“形式”。只需在你的另一种方法中调用你的方法word_数据库。只需在你的另一种方法中调用你的方法word_数据库。我正考虑将我原来的问题添加到两个单独的问题中,特别是出于这个原因。特别是如何清理代码并使用最佳/更好的形式。再次感谢,非常有用。我正考虑将我原来的问题添加到两个单独的问题中,尤其是出于这个原因。特别是如何清理代码并使用最佳/更好的形式。再次感谢,非常有帮助。我知道这不是一个理想的情况,使其成为面向对象的代码,只是想实践一些。不过,感谢您的回答。我知道这不是一个将其转换为面向对象代码的理想情况,只是想练习一下。谢谢你的回答。