第十三章面向对象编程
在 Python 中,面向对象编程主要有两个主题,就是类和类实例。
利用 class 关键字创建一个类:
class MyNewObjectType(bases): #bases 参数用于继承的父类
‘define MyNewObjectType class’
Class_suite
object 是“所有类之母”,若未指明父类,则object 将作为默认的父类。
创建一个实例的语法:(注意:没有使用 new,Python 根本就没有 new 这个关键字)
myFirstObject = MyNewObjectType()
添加类方法:
class MyDataWithMethod(object): #定义类
def printFoo(self): #定义方法
print ‘You invoked printFoo()’
你可能注意到 self 参数,它在所有的方法声明中都存在。并且必须是第一个参数。这个参数代表实例对象本身,当你调用方法的时候由解释器悄悄地传递给方法,而不需要你自己传递 self。
init ()方法:类似于一个构造器,但不能说是一个构造器(因为 Python 没有使用
new),它在创建一个新的对象时被调用,完成一个初始化工作。
类、属性和方法的命名方式:
类:通常大写字母打头。这是标准惯例。有助于识别类。属性:小写字母打头+ 驼峰,使用名词作为名字。
方法:小写字母打头+ 驼峰,使用谓词作为名字。
在 Python 中,声明与定义类是没有什么区别的,因为它们是同时进行的,定义(类体) 紧跟在声明(含class 关键字的头行)和可选(但总是推荐)的文档字符串后面。
Python 不支持纯虚函数(如 C++)或抽象方法(如 Java)。
Python 严格要求,没有实例,方法是不能被调用的。方法必须绑定(到一个实例)才能被直接调用。
dir(class_name): 返回类对象的属性的一个名字列表
class_name. dict
: 返回的是一个字典,key 是属性名,value 是数据值
init ()方法不应该返回任何对象,即,它应该返回 None,否则将产生 TypeError。
实例属性 VS 类属性:
类属性跟实例无关。这些值像静态成员那样被引用,即使在多次实例化中调用类, 类属性的值都不会改变。
子类可以通过继承覆盖父类的方法。类似,如果在子类中覆盖了了 init ()方法,那么基类的 init ()就不会被自动调用了。
同 C++一样,Python 支持多继承。但要处理好两个方面:
- 要找到合适的属性
- 重写方法时,如何调用对应父类以“发挥他们的作用”,同时,在子类中处理好自己的义务
vars()内建函数与 dir()相似,知识给定的对象都必须有一个 dict 属性。vars()返回一个字典,包含了对象存储于其 dict 中的属性(键)和值。
Python核心笔记一:欢迎来到Python世界【我从没见过你 但我懂你】
Python核心笔记二:学习基础、对象、字符串、列表和元组【我从没见过你 但我懂你】
新手入门Python核心笔记三:字典、循环、输入输出、错误和异常、函数【我从没见过你 但我懂你】
更多精彩内容可以关注公众号
第十四章执行环境
Python 有三种不同类型的函数对象。分别是:
- 内建函数(BIF):C/C++写的,编译过后放到 Python 解释器当中的。
- 用户定义的函数(UDF)
- lambda 表达式
compile():
- 它允许程序员在运行时迅速生成代码对象,然后就可以用 exec 语句或者内建函数
eval()来执行这些代码或者对它们进行求值。
- compile(string, file, type) 这三个参数都是必须的。
- 第一个参数:string:要编译的 Python 代码
- 第二个参数:file:虽然是必须的,但通常被置为空串
- 第三个参数:type:字符串,用来表明代码的类型。有三个可能值: ‘eval’:可求值的表达式(和 eval()连用)
‘single’:单一可执行语句(和 exec 连用) ‘exec’:可执行语句组(和 exec 连用) Eg1:
>>>eval_code = compile(‘100+200’, ‘’, ‘eval’)
>>>eval(eval_code) 300
Eg2:
>>>single_code = compile(‘print “hello”’, ‘’, ‘single’)
>>>exec single_code Hello
用 compile()预编译重复代码有助于改善性能,因为在调用时不必经过字节编译处理。
exec obj :
接受对象(obj)可以是原始的字符串,也可以是有效的Python 文件。
一旦执行完毕,继续对exec 的调用就会失败,因为 obj 已经到了EOF 了,若想继续调用 exec,则必须对 obj 调用 seek(0)到文件开头。
tell()方法:告知当前在文件的何处os.path.getsize():告知对象文件有多大
结束执行:
- sys.exit() and SystemExit
- sys.exitfunc()
- os._exit(status):跟以上两种不同,它不执行任何清理就直接退出 Python 解释器。且 status 参数是必须的。
第十五章正则表达式
Python 通过标准库的 re 模块来支持正则表达式(RE)。
搜索 and 匹配:“模式匹配(patten-mactching)”
- 搜索(searching):在字符串任意部分中搜索匹配的模式
- 匹配(matching):判断一个字符串能否从起始处全部或部分的匹配某个模式
正则表达式中常见的符号和字符
记号 |
说明 |
举例 |
re1|re2 |
匹配 re1 或者 re2 |
foo|bar |
. |
匹配任意字符串(换行符除外) |
b.b |
^ |
匹配字符串的开始 |
^Dear |
$ |
匹配字符串的结尾 |
/bin/*sh$ |
* |
匹配前面出现的正则表达式零次或多次 |
[A-Za-z0-9]* |
+ |
匹配前面出现的正则表达式一次或多次 |
[a-z]+\\.com |
? |
匹配前面出现的正则表达式零次或一次 |
goo? |
{N} |
匹配前面出现的正则表达式 N 次 |
[0-9]{3} |
{M,N} |
匹配重复出现 M 到 N 次的正则表达式 |
[0-9]{5,9} |
[„] |
匹配字符组中出现的任意字符 |
[aeiou] |
[x-y] |
匹配从字符 x 到y 的任意一个字符 |
[0-9],[a-z] |
[^„] |
不匹配此字符集中的任意字符 |
[^aeiou] |
\\d |
匹配任何数字,和[0-9]一样,\\D 是\\d 的反义 |
data\\d.txt |
\\w |
匹配任何数字字母字符,和[A-Za-z0-9]一样 |
[A-Za-z]\\w+ |
\\s |
匹配任何空白字符,和[\\n\\t\\r\\v\\f]一样 |
Of\\sthe |
\\b |
匹配单词边界 |
\\bThe\\b |
\\A(\\Z) |
匹配字符串的起始(结束) |
\\ADear |
反斜杠(\\)表示对特殊字符进行转译
re 模块:核心函数和方法
函数/方法 |
描述 |
模块的函数 |
|
compile(pattern) |
对正则表达式模式 pattern 进行编译 |
re 模块的函数和 regex 对象的方法 |
|
match(pattern,string) |
用 pattern 去匹配 string ,成功返回对象,否则返回 None |
search(pattern,string) |
在 string 中去搜索 pattern 第一次出现,结果同上 |
findall(pattern,string) |
在 string 中搜素 pattern 非重复出现,返回列表 |
finditer(pattern,string) |
功能同 findall,但返回的是一个迭代器 |
split(pattern,string) |
用 pattern 中的分隔符把 string 割成一个列表 |
sub(pattern,repl,string) |
把 string 中所有 pattern 的地方替换为 repl |
匹配对象的方法 |
|
group(num=0) |
返回全部匹配对象(或指定编号是 num 的子组) |
groups() |
返回一个包含全部匹配的子组的元组 |
r’sring’:用于忽略 string 中的所有特殊字符
正则表达式本身默认是贪心的,解决办法就是用“非贪婪”操作符“?”。这个操作符可以用在“*”、“+”或者“?”的后面,它的作用是要求正则表达式引擎匹配的字符越少越好。
第十六章网络编程
客户端/服务器架构
客户端/服务器网络编程:
在完成服务之前,服务器必需要先完成一些设置。先要创建一个通讯端点,让服务器能够“监听”请求。当服务器准备好之后,要通知客户端,否则客户端不会提出请求。客户端比较简单,只要创建一个通信端点,建立到服务器的连接,然后提出请求。一旦请求处理完成,客户端收到了结果,通信就完成了。
套接字:通信端点
- 套接字是一种具有“通信端点”概念的计算机网络数据结构。
- 网络化的应用程序在开始任何通讯前都必需创建套接字。没有它将没办法通信。
- 套接字有两种,分别是基于文件型的和基于网络型的。
- AF_UNIX:“地址家族:UNIX”,基于文件
- AF_INET:“地址家族:Internet”,基于网络
- Python 只支持 AF_UNIX,AF_INET 和 AF_NETLINK 家族
面向连接/面向无连接:
- 面向连接:“虚电路”或者“流套接字”,TCP,套接字类型为 SOCK_STREAM
- 面向无连接:UDP,套接字类型为 SOCK_DGRAM (datagram 数据报)
创建套接字语法:
from socket import *
TCP 套接字:tcpSock = socket(AF_INET, SOCK_STREAM)
UDP 套接字:udpSock = socket(AF_INET, SOCK_DGRAM)
套接字对象的常用函数
函数 |
描述 |
服务器端套接字函数 |
|
s.bind(addr) |
绑定地址 addr(主机号,端口号)到套接字 |
s.listen(num) |
开始 TCP 监听,最多允许 num 个连接进来 |
s.accept() |
被动接受 TCP 客户端连接,(阻塞式)等待连接的到来 |
|
|
客户端套接字函数 |
|
s.connect() |
主动初始化 TCP 服务器连接 |
s.connect_ex() |
Connect()函数的扩展版本,出错时返回出错代码,而不是异常 |
公共用途的套接字函数 |
|
s.recv() |
接收 TCP 数据 |
s.send() |
发送 TCP 数据 |
s.sendall() |
完整发送 TCP 数据 |
s.recvfrom() |
接收 UDP 数据 |
s.sendto() |
发送 UDP 数据 |
s.close() |
关闭套接字 |
第十七章网络客户端编程
把因特网比作是一个数据交换中心,数据交换的参与者是一个服务提供者和一个服务的使用者,有人把它比作“生产者– 消费者”,一般是一个生产者对多个消费者。
文件传输网际协议:
- FTP:文件传输协议(File Transfer Protocol)
- UUCP:Unix-to-Unix 复制协议(Unix-to-Unix Copy Protocol)
- HTTP:超文本传输协议(Hypertext Transfer Protocol)
- rcp/scp/rsync:Unix 下的远程文件复制指令
一般编程步骤:
- 连接到服务器
- 登陆(如果需要的话)
- 发出服务请求(有可能有返回信息)
- 退出
Python 和 FTP:from ftplib import FTP Python 和 NNTP:from nntplib import NNTP Python 和 SMTP:from smtplib import SMTP
对于 Python 中的 FTP、NNTP、SMTP 客户端编程的“API”,此核心笔记不予累赘,请请阅相关文档。