AI智能
改变未来

新手入门Python核心笔记四:面向对象、执行环境、正则表达式、网络编程【我从没见过你 但我懂你】

第十三章面向对象编程

在 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”,此核心笔记不予累赘,请请阅相关文档。

 

 

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 新手入门Python核心笔记四:面向对象、执行环境、正则表达式、网络编程【我从没见过你 但我懂你】