所以,我现在正在用Python开发一个简单的web-scraper,但我对如何构建代码有疑问。在其他编程语言中(特别是像C ++和C#这样的编译语言),我一直习惯将所有函数包装在类中。即在我的网络抓取示例中,我会有一个类似“WebScraper”的类,然后保存该类中的所有函数。如果我需要实例化原始“WebScraper”类的多个实例,我甚至可能会创建第二个辅助类,如“WebScraperManager”。
但这引出了我当前的问题。当前的例子中是否会有类似的逻辑?或者我只是简单地定义一个WebScraper.py文件,在该文件中没有包装类,然后只需将我需要的函数导入到一些main.py文件中?
答案 0 :(得分:2)
类和函数之间的区别应该是类具有状态。有些类没有状态,但这很少是一个好主意(我确定有例外,例如抽象基类(ABCs),但我不确定它们是否计数),而且某些函数确实有状态,但是这很少是一个好主意(缓存或工具可能是例外)。
如果你想要一个URL作为输入,并说一个dict作为输出,然后你完成了那个网站,没有理由去上课。只需要一个带URL的函数并返回一个dict。无状态函数比类更简单抽象,因此所有其他条件相同,更喜欢它们。
然而,通常可能涉及中间状态。例如,也许你正在废除一系列以基本网址为基础的网页,而且急切地做这一切太昂贵了。也许那么你想要的是一个以根URL作为构造函数的类。然后它有一些方法可以查询它可以跟踪哪些子URL,以及用于排序后续子级的方法,这些方法可能存储在嵌套数据结构中。
当然,如果你的任务相当复杂,你可能会有使用类或调用函数的类的函数层。但持久状态是一个很好的指标,表明当前的任务是应该写成一类还是一组功能。
编辑:只是为了关闭循环并回到最初的问题:不,我会说在课程中包装所有函数并不是pythonesque。 python中的自由函数就好了,这完全取决于什么是合适的。此外,术语pythonesque不是非常pythonic; - )
答案 1 :(得分:1)
你的意思是" pythonic"。
这取决于面向对象,可扩展......你想要实现吗?我会使用类而不是简单的函数。让我们明天你想要一个CraiglistScrapper和一个FacebookScrapper ......我会创建一个抽象类" Scrapper"然后上面的两个继承了这个并重新实现你需要的东西(多态)。我的意思是面向对象的原则和模式是语言无关的。现在我不会拥有所有的功能"在课堂上(单一责任原则),每次你编码时都要记住这个词" SOLID"。