python - 在 Python 中如何从使用函数列表过渡到使用类?

标签 python function class python-2.7 oop

首先让我声明,我通过反复试验和大量谷歌搜索完全自学了 python 编程,所以请原谅我对适当的编程术语的无知。

话虽如此,假设我正在编写代码来抓取网站并返回一些信息。在测试的早期阶段,我会“逐行”编写代码,就像在任何函数之外:

from bs4 import BeautifulSoup
import requests
url = "https://en.wikipedia.org/wiki/Web_scraping"
headers = {'User-agent':'Mozilla/5.0'}
page = requests.get(url, headers = headers)
soup = BeautifulSoup(page.text)
print soup.title

然后随着脚本得到验证并且变得更加复杂,我可能会将更大的代码“单一任务操作”放入函数中:

from bs4 import BeautifulSoup
import requests

def make_soup(url):
    headers = {'User-agent':'Mozilla/5.0'}
    page = requests.get(url, headers = headers)
    soup = BeautifulSoup(page.text)
    return soup

def list_table_of_contents(soup):
    toc_elem = soup.find('div', id = 'toc')
    toc_level1 = toc_elem.find_all('li', class_ = 'toclevel-1')
    toc_level1_list = [i.text for i in toc_level1]
    return toc_level1_list

url = "https://en.wikipedia.org/wiki/Web_scraping"
soup = make_soup(url)
toc_level1_list = list_table_of_contents(soup)
for i in toc_level1_list:
    print i

问题是一旦我在一个脚本中有 10 个不同的函数,就很难理解发生了什么并进行修改。我猜测使用类将是下一个合乎逻辑的步骤,但我不确定我将如何以我上面描述的方式实现它们......

在我看来,“逐行”编程就像写菜谱,而使用函数就像按照特定菜谱(输入 -> 输出)制造工厂,那么什么是类?

根据我对类的阅读和使用它们的经验,它们本质上是一种轻松创建具有特定属性的多个“对象”的方法。

最佳答案

基于示例类的上述实现。希望这是有道理的。类可以使事情变得更容易,因为它允许您抽象功能,然后从一个或另一个类继承。在下面的类中,我们继承自 object 基类。

class MyBeautifulScraper(object):

    def __init__(self, site_to_scrape, headers={'User-agent':'Mozilla/5.0'}):
        self.site_to_scrape = site_to_scrape
        self.headers = headers
        self.soup = None

    def make_soup(self):
        page = requests.get(self.site_to_scrap, headers = self.headers)
        self.soup = BeautifulSoup(page.text)

    def get_title(self):
        return self.soup.title

    def list_table_of_contents(self):
        toc_elem = self.soup.find('div', id = 'toc')
        toc_level1 = toc_elem.find_all('li', class_ = 'toclevel-1')
        toc_level1_list = [i.text for i in toc_level1]
        return toc_level1_list

my_soup = MyBeautifulScraper("https://en.wikipedia.org/wiki/Web_scraping")
print my_soup.get_title()
toc_level1_list = my_soup.list_table_of_contents()

for i in toc_level1_list:
    print i

您可以在不重新创建类的情况下向该类添加功能,只需创建一个继承自上述类的专用类,然后使用其他功能对其进行扩展即可:

class AnotherScraper(MyBeautifulScraper):

    def additional_functionality(self):
        ....

    # override existing functionality and make it do something different
    def get_title(self):
        return 'Title: {0}'.format(self.soup.title)

这就是面向对象编程如此强大的原因。事实上,您可以重用和扩展预先存在的类以继承或覆盖现有功能,而不会丢失初始功能。

希望对你有帮助

关于python - 在 Python 中如何从使用函数列表过渡到使用类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31251445/

相关文章:

javascript - 这两个函数的范围有什么区别

java - 如何从不同的类和包访问对象?

c++ - boost 函数映射到字符串

ruby - 使用类与模块在 Ruby 中打包代码

具有两个名称但不带 : 的 C++ 结构定义

python - Matplotlib.动画 : how to remove white margin

Python:合并数据框并将所有值保留在单元格中(如果不相同)

python - 如何居中 wx.BusyInfo() - wxpython?

python - matplotlib 直方图中的圆条

PHP : Function argument must be an Object with dynamic class name