所以我开始学习类,当我应该创建一个新类而不是一个函数时,它仍然有点令人困惑。我正在制作一个从网站获取信息的代码,将信息存储在数据库中并使用这些信息制作图表。(我目前有一个名为" 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()
答案 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。
如果您无法确定使用类的好处,请使用函数。