Day28:正则表达式
- 正则表达式(Regular Expression,在代码中可简写为regex、regexp或re)又称规则表达式,是一个特殊的字符序列,通常被用来检索、替换那些匹配某个模式的文本
- Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式,re 模块使 Python 语言拥有全部的正则表达式功能,其中常用功能函数有:
1.match函数用于检测字符串开头位置是否匹配,匹配成功返回一个匹配的对,否则返回None,
它的语法为re.match(pattern, string, flags=0),pattern表示匹配的正则表达式,
string表示要匹配的字符串,flags用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等
2.search函数用于扫描整个字符串并返回第一个成功的匹配,
它的语法为re.search(pattern, string, flags=0),它的参数和match函数的一样,不同在于re.match只匹配字符串的开始,
如果字符串的开始不匹配则直接返回None;而re.search则匹配整个字符串,直到找到一个匹配的
3.sub函数用于替换字符串中的匹配项,
语法为re.sub(pattern, repl, string, count=0, flags=0),repl 表示替换的字符串,
也可为一个函数,string 表示 要被查找替换的原始字符串,count表示模式匹配后替换的最大次数,
默认 0 表示替换所有的匹配
4.compile函数用于编译正则表达式,生成一个正则表达式对象,
供 match() 和 search() 这两个函数使用,语法为re.compile(pattern[, flags]),
pattern表示一个字符串形式的正则表达式,flags可选表示匹配模式,比如忽略大小写,多行模式等
- 正则表达式可以包含普通或者特殊字符,大部分普通字符都是最简单的正则表达式,还有一些特殊字符可以拥有其他的功能,比如
.表示匹配除了换行的任意字符
^匹配字符串的开头
$匹配字符串的末尾
*重复匹配0到任意次
+匹配1到任意次
?重复匹配0次或1次
{m}匹配n次
{m, n}匹配m 到 n 次等
这些特殊字符有很多,慢慢用熟练了就容易记住了
- 更多关于正则表达式的方法查看官方文档:https://docs.python.org/zh-cn/3/library/re.html
Day29:面向对象(一)
- 类是用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法,创建一个类的语法如下:
class 类的名称:
语句块
- 对象是通过类定义的数据结构实例,包括两个数据成员分别是变量和方法
-
实例是根据类创建出来的一个个具体的对象,每个对象都拥有相同的方法,但各自的属性可能不同;类名加括号就是实例化,实例化会自动调用init方法,如
xkd = XKD()
就是一个实例化,而其中的XKD就是一个类 - 变量分为类变量和实例变量,类变量在整个实例化的对象中是公用的,实例变量就是定义在类里面的方法中的变量,简单来说实例变量是实例特有的,类变量是类和实例共有的
- 方法就是类中定义的函数,分为实例方法、静态方法和类方法
1.实例方法是在类中定义的方法,并且方法的第一个参数一般是self,
指向对象本身,使用的时候只能通过实例化的对象调用,对象名称.方法名
2.静态方法也是定义在类中,不同的是在类中定义静态方法时要在方法前加注解
@staticmethod,静态方法可以被实例对象和类对象调用
3.类方法同样是定义在类中,定义类方法时要在方法前加注解@classmethod,
方法中的第一个参数为类本身,约定写成cls,类方法可以被实例对象和类对象调用
- 类的属性可以分为共有属性、私有属性和保护属性
1.在类中定义的,所属这个类的所有对象都可以访问的属性,叫做公有属性
2.两个下划线开头的属性表示私有属性,私有属性不能在类的外部被使用或直接访问,
在类的内部方法的使用为self.__private_attrs
3.一个下划线开头的属性为保护属性,只有类实例和子类实例能访问,
需通过类提供的接口进行访问
Day30:面向对象(二)
-
继承即一个派生类(derived class)继承基类(base class)的字段和方法,继承可以很方便的帮助子类拥有父类的属性和方法,减少代码冗余,子类可以定义自己的方法和属性,也可以覆盖父类的方法和属性
-
继承分为实现继承和接口继承,实现继承指使用基类的属性和方法而无需额外编码的能力,接口继承指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构父类方法)
比如此时有两个类, 一个是Animal类、一个是Person类,
Person类继承Animal类中的方法和属性,那就是说Animal类是父类(基类),Person类是子类(派生类)
class Animal:
def __init__(self):
self.type = 'animal'
def play(self):
print('play')class
Person(Animal):
def talk(self):
print('talk')
person = Person()
person.play() # 子类可以调用父类的方法
print(person.type) # 子类可以调用父类的属性
- 在继承中,属性的查找顺序是:先从对象自身的dict中查找->然后从对象所在类的dict中查找->然后从父类的dict中查找, 如果没有找到,会报AttributeError的错误
- 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写,方法重写后,默认调用子类的方法
- Mixin是一种设计模式,通过多继承的方式对类的功能进行增强,作用是可以在不修改任何源代码的情况下,对已有类进行扩展,既可以根据需要使用已有的功能进行组合,来实现“新”类,还能很好的避免类继承的局限性,因为新的业务需要可能就需要创建新的子类
在Mixin类中,不能写初始化的__init__方法,因为Mixin类不做为独立类使用,
因为Mixin类原则上必须作为其他类的基类,实现其他类的功能增强
Mixin类的基类必须也是Mixin类,使用Mixin方式增强功能的的类,
必须将Mixin类写在继承列表的第一个位置
Day31:魔术方法
- 魔术方法就是在我们定义的类中定义一些”不一般”的方法,使类的使用更方便、完善、健壮,是python特有的方法,一般用前后__包含,例如new
init()方法是一个初始化方法,在一个实例被创建之后调用
new()方法用于创建类并返回这个类的实例,总是在初始化方法被执行前执行
del()相当于C++的析构函数,在对象要被销毁前执行
repr()用来自定义对象的输出模式
iter()、next()通常是成对出现的,用来创建用户自定义的迭代器
call()方法允许一个类的实例像函数一样被调用如:x(a, b)调用为 x.call(a, b)
add()、sub()、mul()、truediv()等方法是运算符相关的魔术方法,实现了加减乘除等运算
Day32:上下文管理器
-
上下文管理器是一个包装任意代码块的对象,上下文管理器保证进入上下文管理器时,每次代码执行的一致性,当退出上下文管理器时,相关的资源会被正确的回收,且一定能够保证退出步骤的执行
-
实现上下文管理器有两种方式,一个是通过类实现
__enter__
和__exit__
方法,也就是通过with语句进行上下文管理
with语法为:with 表达式 [as 目标]:代码块
__enter__(self)在 进入上下文管理器时调用,其返回值将被放入with-as语句中as说明符指定的变量中
__exit__(self,type,value,tb)方法在离开上下文管理器时调用,
如果有异常出现,type、value、tb分别为异常的类型、值和追踪信息,
如果没有异常3个参数均设为None,它的返回值为True时,表示被引发的异常得到了处理,反则亦然
- 还有一种是通过contextlib模块装饰器和生成器实现上下文管理
contextlib模块是Python标准库提供的更加易用的上下文管理器工具模块,
它是通过装饰器实现的,不需要再创建类以及使用__enter__和__exit__这两个
方法,比with语句更加方便
contextlib模块包含一个装饰器contextmanager和一些辅助函数,
装饰器contextmanager只需要写一个生成器函数就可以代替自定义的上下文管理器
Day33:反射
-
解释类型的语言,在程序被加载到内存运行的时候,可以通过某种方式获取对象的类型、属性等信息的过程叫做反射
-
具有反射能力的内置函数有:getattr函数用于判断对象是否有对应的属性,语法为
getattr(object,name[,default])
,object表示对象,name表示对象属性,default表示默认返回值,如果不提供该参数,在没有对应属性时,将触发AttrbuteError -
setattr() 函数对应函数getattr(),用于设置属性值,若属性不存在则先创建然后赋值,语法为
setattr(object, name, value)
,object表示对象,name表示属性,value表示属性值 -
hasattr函数用于判断对象是否包含对应的属性,返回Bool值,语法为
hasattr(object,name)
,object表示对象,name表示属性名(字符串) -
delattr() 函数用来删除指定对象的指定名称的属性,和setattr函数作用相反,属性必须存在,否则发出AttributeError,语法为
delattr(object, name)
,object表示对象,name表示属性名(字符串)
网友评论