什么时候创建一个新类?

时间:2016-02-19 19:39:14

标签: python python-3.x

所以我开始学习类,当我应该创建一个新类而不是一个函数时,它仍然有点令人困惑。我正在制作一个从网站获取信息的代码,将信息存储在数据库中并使用这些信息制作图表。(我目前有一个名为" Stats"这样做的类)我想使用Tkinter创建按钮,以便人们可以选择他想在图表中看到的信息类型,我的问题是我是否应该为Tkinter创建一个不同的类并制作图形,或者我是否应该将它们作为函数从"统计"类。这是我的代码:

from bs4 import BeautifulSoup
import urllib.request
import sqlite3
from matplotlib import pyplot as plt
from cairocffi import *
plt.style.use('ggplot')
plt.title('Online')
plt.ylabel('Number of players')

class Stats():
def __init__(self):
    self.conn = sqlite3.connect('test.db')
    self.c = self.conn.cursor()
    self.create_table()
    self.a = []
    url = "*************"
    page = urllib.request.urlopen(url)
    soup = BeautifulSoup(page.read(), 'html.parser')
    stats = soup.find_all("div", {"id":"RightArtwork"})
    number = soup.find_all("tr", {"class":"Odd"})

    for totalOnline in stats:
        divTotal = totalOnline.find_all("div")
        for totalOnline in divTotal:
            total = list(totalOnline.text)
            total[0:5] = [''.join(total[0:5])]
            total[1:19] = [''.join(total[1:19])]
            #self.number,self.name = total.split(",")
            self.number = int(total[0])
            self.name = str(total[1])
            #print(self.name)
            self.data_entry()
    self.graph()






def create_table(self):
    self.c.execute('CREATE TABLE IF NOT EXISTS testDB(name TEXT, number REAL)')

def data_entry(self):
    self.c.execute("INSERT INTO testDB(name, number) VALUES(?, ?)",
                   (self.name, self.number, ))
    self.conn.commit()

def comparison(self):
    highestNumber = self.c.execute('SELECT number FROM testDB ORDER BY number DESC LIMIT 1')
    for rows in highestNumber:
        print("The highest numbers of players online was " + str(rows[0]))

    lowestNumber = self.c.execute('SELECT number FROM testDB ORDER BY number ASC LIMIT 1')
    for rows in lowestNumber:
        print("The lowest number of players online was "+ str(rows[0]))

def graph(self):
    self.c.execute('SELECT number FROM testDB')
    values = []
    values2 = []
    i = 0
    for row in self.c.fetchall():
        floats = float(''.join(map(str,row)))
        values.append(floats)
        print(values[-1])
    while i < len(values):
        i = i + 1
        values2.append(i)

    self.comparison()

    plt.plot(values2,values)
    plt.show()
    self.c.close()
    self.conn.close()



Stats()

1 个答案:

答案 0 :(得分:1)

通常,将输出与计算分开是个好主意。 如果将Tkinter代码放在单独的类中:

class GUI(tk.frame):
    def __init__(self, stats):
        ...

然后您的Stats课程可能更具可重用性。你可以编写其他脚本 使用Stats类 - 例如,使用Stats的命令行脚本 没有Tkinter,或者使用不同GUI框架或多个GUI框架的脚本 以不同方式使用Stats的脚本。

如果Stats代码与Tkinter代码纠缠在一起,那么这些代码都不会 可能的。

要遵循上述建议,__init__方法不应调用graph。让 GUI代码就是这样做的。

使用类可以解决的任何问题也可以通过简单解决 功能。有时使用类可以使代码更简洁,但是,通过 避免需要明确地将状态作为参数传递给每个人 功能,或利用继承。

当试图决定何时使用类时,试着想象一下代码会是什么 看起来像一个类与普通函数。问问自己你正在获得什么 通过使用一个类。是否有可能进行子类化?有没有办法 继承的优势?代码是否通过使用变得更紧凑/简洁 一个类而不是普通函数?班级是否利用special methods?考虑杰克迪德里希关于何时的建议 到Stop Writing Classes

如果您无法确定使用类的好处,请使用函数。