函数封装

第7关 初识爬虫

不想你离开。 提交于 2020-02-06 22:36:22
你造吗,今天是个大喜的日子!来到这儿,就意味着你爬虫已经入门啦! 在这个重要又喜悦的日子里,我们就干三件事:回顾前路、项目实操、展望未来。 回顾前路,是为了复习0-6关所学的知识。项目实操,是通过写一个爬虫程序把所学的知识用起来。展望未来,是预告一下我们之后会遇到的风景。 马上开始吧~ 回顾前路 在前面,我们按关卡学了好多好多知识。而这么多的内容,我们用【项目实现】和【知识地图】两张图就能说清。 【项目实现】: 任何完成项目的过程,都是由以下三步构成的。 先需要明确自己的目标是什么,然后分析一下如何实现这个目标,最后就可以去写代码了。 当然,这不是一个线性的过程,而可能出现“代码实现”碰壁后然后折返“分析过程”,再“代码实现”的情形。 接下来是【知识地图】:前面6关所讲的爬虫原理,在本质上,是一个我们所操作的对象在不断转换的过程。 总体上来说,从Response对象开始,我们就分成了两条路径,一条路径是数据放在HTML里,所以我们用BeautifulSoup库去解析数据和提取数据;另一条,数据作为Json存储起来,所以我们用response.json()方法去解析,然后提取、存储数据。 你需要根据具体的情况,来确定自己应该选择哪一条路径。 也可以参考图片上的注释,帮助自己去回忆不同对象的方法和属性。不过,老师还是希望你能把这个图记在心里。 好啦,0-6关的内容就梳理完成啦~

WTL学习记(二):WTL的消息处理链

ε祈祈猫儿з 提交于 2020-02-05 16:03:18
前小节简单介绍了WTL安装注意的一点小的细节并举例简述如何对自己的窗口类添加对消息的响应,这一节主要就WTL如何实现对windows窗口过程函数的封装陈述些自己的理解。 一、ATL对Windows窗口的封装 WTL的基础是ATL。WTL的框架窗口是ATL窗口类的继承。因此,先介绍一下ATL对Windows窗口的封装。 由win32 API 中创建Windows应用程序可以知道创建窗口和窗口工作的逻辑是: 1 定义一个窗口类 2 注册窗口类 3 创建该类窗口并显示和激活该窗口 4 窗口的消息处理逻辑在窗口函数中。(该函数在注册窗口类时指定) 可以得知,对于窗口的封装关键在于怎样封装窗口消息处理机制。怎样将消息传递给相应的类的实例。通常的办法是采用虚函数:将每个消息对应生成一个虚函数,这样,在窗口处理函数中,对于每个消息,都调用其对应的虚函数即可。但带来的问题是类的虚函数表过于庞大。ATL的处理机制是只定义了一个虚函数(ProcessWindowMessage())。 图示ATL封装的类的继承关系图。从图中可以看到有两个最基本的类。一个是CWindow,另一个是CMessageMap。 在ATL类中对窗口过程的实现是CWindowImpl。它派生自CWindow、CMessageMap,CWindows是对Windows的窗口API的一个封装。它把一个Windows句柄封装了起来

axios封装

微笑、不失礼 提交于 2020-02-04 00:25:20
优点 统一维护管理接口; 支持接口代理转发; 读取环境配置,区分处理环境。 拦截请求和响应,处理登录超时、404 等异常情况; 根据请求的配置匹配接口 URL 前缀且作支持做特殊处理。 封装 安装 axios npm install axios; 创建实例 通过创建实例,操作实例的方式进行接口请求。 //request.js import axios from 'axios'; // 引入axios import Qs from 'qs'; // 引入qs模块,用来序列化post类型的数据 import { autoMatch, checkStatus } from './utils'; // 处理函数 import { Toast } from 'mint-ui'; //提示框 // 创建axios实例 const instance = axios.create({ // baseURL: process.env.BASE_URL, timeout: 30000, // 请求超时时间 // `transformRequest` 允许在向服务器发送前,修改请求数据 transformRequest: [function (data) { // 对 data 进行任意转换处理 return data; }], // `transformResponse` 在传递给 then

关于axios的一些封装

牧云@^-^@ 提交于 2020-02-04 00:22:14
关于Axios的封装 为何需要在封装 应用场景,项目中涉及100个 AJAX 请求 ,其中: 1.其中60个需要在 请求头header 设置 token headers: {token: token} 用于权限校验; 2.其中20个为 上传EXCEL文件 需要在请求头中设置 Content-Type ; headers: { 'Content-Type': `multipart/form-data; boundary=${data._boundary}`} 上面说的 1、2、3可以在 全局 request 拦截中 进行处理,但是 代价极大 ,需要为这100个接口都 做判断再做相应处理 ... ;当然也可以不用全局拦截,为每个接口都单独定义,我相信有不少同学仍是这样处理的, 但是 只要有改动,例如现在我要求所有的请求头都新增一个参数,那就只能一个一个接口的改.....这不是我们想要的结果,所以 我们需要对 AJAX再封装!AJAX再封装!AJAX再封装! ,因为相当重要,所以要多说几遍.... ③最后20个请求用来 获取文件流 ,需要指定接受类型 responseType: 'blob' 需要对 全局发起request 进行 拦截 并做 异步处理 ( 强调 :是 异步处理 ); 如果你的项目已经做到一半,现在后端要 加上token权限 做认证; 封装实现 封装其实很简单

C语言函数

老子叫甜甜 提交于 2020-02-02 12:20:28
函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。 函数的定义 无参数定义 dataType functionName ( ) { //body } 有参数的定义 dataType functionName ( dataType1 param1 , dataType2 param2 . . . ) { //body } 注意:函数不能嵌套定义。 实参与形参 C语言函数的参数会出现在两个地方,分别是函数定义处和函数调用处,这两个地方的参数是有区别的。 形参(形式参数) 在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。 实参(实际参数) 函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。 形参与实参的区别与联系 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换

面向对象之封装

余生颓废 提交于 2020-02-02 07:47:31
一 初步 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,一起装进麻袋,然后把麻袋封上口子。照这种逻辑看,封装='隐藏',这种理解是相当片面的 二 如何隐藏 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) # 其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形 # 类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式: class A: __N = 0 # 类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self): self.__X = 10 # 变形为self._A__X def __foo(self): # 变形为_A__foo print('from A') def bar(self): self.__foo() # 只有在类内部才可以通过__foo的形式访问到. # A._A__N是可以访问到的, # 这种,在外部是无法通过__x这个名字访问到。 这种变形需要注意的问题是: 1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N,即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形,主要用来限制外部的直接访问。 2

面对对象之封装

风格不统一 提交于 2020-02-02 06:32:56
在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形 #类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self): self.__X=10 #变形为self._A__X def __foo(self): #变形为_A__foo print('from A') def bar(self): self.__foo() #只有在类内部才可以通过__foo的形式访问到. #A._A__N是可以访问到的, #这种,在外部是无法通过__x这个名字访问到。    这种变形需要注意的问题是: 1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N, 即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形,主要用来限制外部的直接访问。 2.变形的过程只在类的定义时发生一次,在定义后的赋值操作,不会变形。 3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的。 #正常情况 >>> class A: ... def fa

面向对象之封装

一笑奈何 提交于 2020-02-02 05:59:34
封装 封装即隐藏,把属性方法封装起来,使只能通过对象本身调用内部方法才可以获得和修改属性值。 如何隐藏 在python中使用双下划线开头的方式将属性隐藏起来(设置成私有的) class A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self): self.__X=10 #变形为self._A__X def __foo(self): #变形为_A__foo print('from A') def bar(self): self.__foo() #只有在类内部才可以通过__foo的形式访问到. #A._A__N是可以访问到的, #这种,在外部是无法通过__x这个名字访问到。 View Code 其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形 类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式 这种变形需要注意的 问题 是: 1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N, 即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形,主要用来限制外部的直接访问。 2.变形的过程只在类的定义时发生一次,在定义后的赋值操作,不会变形 3.在继承中

面向对象之封装

时光怂恿深爱的人放手 提交于 2020-02-02 04:38:32
一 引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,一起装进麻袋,然后把麻袋封上口子。照这种逻辑看,封装=‘隐藏’,这种理解是相当片面的 二 先看如何隐藏 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形 #类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self): self.__X=10 #变形为self._A__X def __foo(self): #变形为_A__foo print('from A') def bar(self): self.__foo() #只有在类内部才可以通过__foo的形式访问到. #A._A__N是可以访问到的, #这种,在外部是无法通过__x这个名字访问到。 这种变形需要注意的问题是: 1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N, 即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形,主要用来限制外部的直接访问。 2

20200131_用C++封装POSIX线程

安稳与你 提交于 2020-02-02 03:58:38
文章目录 1. 想法 2. 一些要注意的地方 3. 代码文件 Thread.h 头文件 Thread.cc 实现Thread.h头文件 TestThread.cc 测试主程序 Noncopyable.h 禁止赋值/复制操作 makefile 工程文件 1. 想法 通过一个对象来调用,这种方法可以看成是主线程调用一个对象,相当于只有一个主线程,没有子线程。而我们的本意是产生子线程,因此这种方法是不对的。 解决方法:把run函数设置成私有的。 // /// @file Thread.h /// @author xiekun(519686353@qq.com) /// @date 2020-01-31 17:53:03 // # include <iostream> using std : : cout ; using std : : endl ; class MyThread { public : void run ( ) { //... } } ; int main ( void ) { MyThread mythread ; mythread . run ( ) ; //这种写法是error的 return 0 ; } 2. 一些要注意的地方 pthread_creat() 函数 创建线程 第一个是 线程 id 第二个是 线程属性 一般写NULL 第三个是 这个线程要运行的程序