前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重难点 | Python基础知识点9 Python的封装继承多态,推荐收藏

重难点 | Python基础知识点9 Python的封装继承多态,推荐收藏

作者头像
龙哥
发布2019-09-24 13:39:33
4720
发布2019-09-24 13:39:33
举报
文章被收录于专栏:Python绿色通道Python绿色通道

今天是基础系列的最后一篇文章,也是一些新手甚至是老手容易忽略的知识点,面向对象。

所有面向对象语言都有三大特征:封装继承多态.那Python中面向对象怎么做?

下面的内容只是我的经验总结,与官方讲解应该是大同小异,有自己的理解会更好些.

封装: 描述某个对象的属性以及方法。 比如狗,狗的大小,颜色,这些东西就是他的属性,狗会叫,这是他的方法。 一般来说描述特征的都是这个对象的属性,描述行为就是方法。

继承:Python语言也支持继承,并且支持多继承,所有对象的都继承

Object

代码语言:javascript
复制
class Spider(object):

上面这个Spider就继承了object类

什么时候可以用到继承呢?如果两个对象有共同的部分,我们就可以把共同的部分抽取出来,作为父类让子类去继承于他.

代码语言:javascript
复制
class Spider(object):
# 定义一个抽象类
    __metaclass__ = abc.ABCMeta

def __init__(self):
        self.rows_title = [u'招聘标题', u'公司名称', u'公司地址', u'待遇', u'发布日期', u'招聘链接', u'招聘要求描述']
        sheet_name = u'51job_Python招聘'
        return_execl = ExeclUtils.create_execl(sheet_name, self.rows_title)
        self.execl_f = return_execl[0]
        self.sheet_table = return_execl[1]
        self.job_info = []  # 存放每一条数据中的各元素,
        self.count = 0  # 数据插入从1开始的

def crawler_data(self):
'''
        开始爬取数据
        :return:
        '''
for i in range(1, 5):
            url = 'http://search.51job.com/list/000000,000000,0000,00,9,99,python,2,{}.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='.format(
                i)
            self.request_job_list(url)
# 采集不要太快了,否则容易造成ip被封或者网络请求失败
            time.sleep(2)

def request_job_list(self, page_url):
'''
        获取工作列表
        :param page_url:
        :return:
        '''
try:
            headers = {
'Referer': 'http://www.51job.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4549.400 QQBrowser/9.7.12900.400'
            }
            response = requests.get(page_url, headers=headers)
            response.encoding = 'gbk'
# 如果请求失败,则不能继续进行
if response.status_code != 200:
return
            self.parse_job_list(response.text)
except Exception as e:
print '\n\n出现错误,错误信息是:{}\n\n'.format(e.message)

    @abc.abstractmethod
def parse_job_list(self, text):
'''
        解析工作列表的抽象类,具体实现在子类中
        :param text:
        :return:
        '''
pass

def request_job_detail(self, job_href):
'''
        获取工作详情
        :param job_href: 招聘工作的链接
        :return:
        '''
try:
            headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4549.400 QQBrowser/9.7.12900.400'
            }
            response = requests.get(job_href, headers=headers)
            response.encoding = 'gbk'
# 如果请求失败,则不能继续进行
if response.status_code != 200:
return ''

            self.parse_job_detail(response.text)

except Exception as e:
print '\n\n出现错误,错误信息是:{}\n\n'.format(e.message)

    @abc.abstractmethod
def parse_job_detail(self, text):
'''
        定义工作详情的抽象类
        :param text:
        :return:
        '''
pass

比如上面我定义了一个爬虫类,下面我用了子类SpiderBs4来继承父类Spider, 这里面我就可以直接用了父类的一些属性与方法而不用声明。

代码语言:javascript
复制
  
# coding:utf-8
from bs4 import BeautifulSoup
from ExeclUtils import ExeclUtils
from Spider import Spider
import time


class SpiderBs4(Spider):

def __init__(self):
        super(SpiderBs4, self).__init__()

def parse_job_list(self, text):
try:
            soup = BeautifulSoup(text, 'html.parser')
            results = soup.select('div.dw_table > div.el')[1:]
for result in results:
                job_title = result.select('p.t1 span a')
                job_href = result.select('p.t1 span a')
                job_company = result.select('span.t2  a')
                job_address = result.select('span.t3')
                job_salary = result.select('span.t4')
                job_date = result.select('span.t5')

                job_title = job_title[0].attrs['title'] if len(job_title) > 0 else ''
                job_href = job_href[0].attrs['href'] if len(job_href) > 0 else ''
                job_company = job_company[0].attrs['title'] if len(job_company) > 0 else ''
                job_address = job_address[0].text if len(job_address) > 0 else ''
                job_salary = job_salary[0].text if len(job_salary) > 0 else ''
                job_date = job_date[0].text if len(job_date) > 0 else ''

                self.job_info.append(job_title)
                self.job_info.append(job_company)
                self.job_info.append(job_address)
                self.job_info.append(job_salary)
                self.job_info.append(job_date)
                self.job_info.append(job_href)

                self.request_job_detail(job_href)
                time.sleep(1)
except Exception as e:
print '\n\n出现错误,错误信息是:{}\n\n'.format(e.message)

def parse_job_detail(self, text):
try:
            soup = BeautifulSoup(text, 'html.parser')
try:
# 工作描述
                job_statements = soup.select('div.job_msg')
                job_statement = job_statements[0].text.strip(' ').replace(' ', '').replace('\n', '')
except Exception as e:
print e.message
                job_statement = '职位无明确描述'

            self.job_info.append(job_statement)
            self.count = self.count + 1
            ExeclUtils.write_execl(self.execl_f, self.sheet_table, self.count, self.job_info, u'bs4_51job招聘.xlsx')
print '采集了{}条数据'.format(self.count)
# 清空集合,为再次存放数据做准备
            self.job_info = []
except Exception as e:
print '\n\n出现错误,错误信息是:{}\n\n'.format(e.message)

#
#
# if __name__ == '__main__':
#     x = SpiderBs42()
#     x.crawler_data()

多态:某个对象会有相同的行为,但具体这些行为又有所不同。 比如说吃饭,大人吃饭使用筷子,小孩吃饭用勺子,吃放的行为有所不同. 这个时候我们把吃饭的行为抽象出来,放在父类里。

代码语言:javascript
复制
  @abc.abstractmethod
def parse_job_list(self, text):
'''
        解析工作列表的抽象类,具体实现在子类中
        :param text:
        :return:
        '''
pass
        
      @abc.abstractmethod
def parse_job_detail(self, text):
'''
        定义工作详情的抽象类
        :param text:
        :return:
        '''
pass

比如上面我在父类里写了两个抽象方法,我并没有直接去实现它,而是在他们的子类中去实现,因为他们各自实现是不同的。

好了今天的封装继承多态就讲这些,而这些东西一定要灵活运用,死记硬背是不行的,一定要多想想。你又是如何使用封装继承多态的呢?

【完】

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python绿色通道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档