【问题标题】:how can I object-orient a simple website copying app?我怎样才能面向对象一个简单的网站复制应用程序?
【发布时间】:2025-12-26 20:30:06
【问题描述】:

直截了当,我是面向对象编程的新手,在学习 Python 时,我编写了一个简单的过程程序,它接受 URL 并将数据从 URL 获取到文本文件。

代码看起来像这样, 忽略变量,它是由它组成的!

def open_URL(url):
    # try the URL
    # except errors

def fetch_raw_content(url):
    # fetch the raw content from web
    # return raw_content

def clean_up_raw(raw_content):
    # clean up html tags and stuff
    # format the raw content
    # return content

def write_to_file(filename, content):
    # create a file with filename
    # open the file
    # write the content
    # close the file


raw = fetch_raw_content(open(open_URL("somesite.com")))

content = clean_up_raw(raw)
write_to_file(content)

我想知道我是否可以这样做是一种面向对象的方式,因为我对面向对象世界的接触有限,如果有人建议我以某种方式可以使这个程序面向对象,谢谢。 :)

【问题讨论】:

  • 这里不需要 OOP,只需一个“入口点”函数,它接受 urlfilename 并依次调用您的其他函数。
  • FWIW,我想你这样做是为了练习,但如果你真的需要在 Python 中进行一些严肃的网络抓取,你可能需要查看Scrapy

标签: python oop design-patterns object-oriented-analysis


【解决方案1】:

OOP 是为解决代码设计问题而发明的工具。你的设计没有问题,也没有什么需要修复的。如果您确实需要代码更加抽象和可配置,OOP 只会为自己买单。例如,稍后,您可能会意识到您的“内容”可以从不同的来源获得,而不仅仅是 URL - 文件、数据库等。在这种情况下,您可以通过创建抽象类 @987654321 来“优化”阅读部分@ 并为每种类型的来源指定特定的“读者”:

 class Reader:
     def read():
        # return the content

 class URLReader(Reader)...

 class FileReader(Reader)...

 class DatabaseReader(Reader)...

同样,如果您的“清理”过程可以分阶段进行,并且您只想在特定情况下应用其中的一些,您可以像这样抽象它:

 class Action:
    def apply(content):
        # apply the action to the content

 class RemoveWhiteSpace(Action)...

 class RemoveFontTags(Action)...

 class OptimizeLineBreaks(Action)...

 class Sequence(Action)...

然后:

 content = Sequence(RemoveWhiteSpace(), OptimizeLineBreaks()).apply(content)

同样,如果您确实需要如此大的灵活性,这些努力只会为您带来回报。在大多数情况下,您无需使用 class 关键字即可解决 Python 中的任何问题。

【讨论】: